## 定义
暂时存储数据的地方,是一种数据标记,通过变量名可以取出对应内存空间中的数据
## 声明规则
* 变量名和值之间不能有空格
* 无需声明变量类型(默认字符串)
* 变量名只能包含数字、字母、下划线
* 变量名不能以数字开头
* 区分大小写
>变量赋值中包含反引号(`)则表示将命令执行的结果返回给变量
```
[henry@localhost shell]$ var1=`whoami`
[henry@localhost shell]$ echo $var1
henry
```
### 单引号和双引号的区别
单引号变量不识别特殊语法
双引号变量能识别特殊语法
```
[henry@localhost shell]$ name=Henry
[henry@localhost shell]$ echo1='my name is ${name}'
[henry@localhost shell]$ echo2="my name is ${name}"
[henry@localhost shell]$ echo $echo1
my name is ${name}
[henry@localhost shell]$ echo $echo2
my name is Henry
```
## 作用域
父子Shell中的变量无法相互访问
环境变量在任意子进程都可以访问
> bash和sh命令可以开启子shell
> pstree可以查看当前shell存在的域
### Shell的调用方式不同,作用域不同
bash和sh调用会开启对应的子shell
source和./脚本名调用不会开启对应的子shell
```
[henry@localhost shell]$ cat test.sh
name=henry1
[henry@localhost shell]$ name=henry
[henry@localhost shell]$ bash test.sh
[henry@localhost shell]$ echo $name
henry *****开启子shell定义变量name,父shell的name变量没变
[henry@localhost shell]$ source test.sh
[henry@localhost shell]$ echo $name
henry1 *****在父shell执行脚本name变量被替换
```
## 特殊变量
| 变量名 | 说明 | 注释 |
| --- | --- | --- |
| $? | 返回上一命令执行结果状态 | 0执行成功,大于0执行失败 |
| $0 | 获取shell脚本的文件名以及路径 | |
| $n | 获取脚本的第n个参数 | |
| $# | 获取脚本的参数个数 | |
| $* | 获取脚本的所有参数 | 带“”输出参数时所有参数整合为一个字符串 |
| $@ | 获取脚本的所有参数 | 带“”输出参数时每个参数分别整合为独立字符串 |
```
[henry@localhost shell]$ cat test.sh
echo "参数个数:$#"
echo "脚本路径:$0"
echo "参数:$1 $2 $3"
echo '$*输出所有参数:'
for var in "$*"
do
echo $var
done
echo '$@输出所有参数:'
for var in "$@"
do
echo $var
done
[henry@localhost shell]$ ./test.sh a b c
参数个数:3
脚本路径:./test.sh
参数:a b c
$*输出所有参数:
a b c
$@输出所有参数:
a
b
c
```