1、本地变量
当前bash有效,新开一个窗口【新的bash】无效;
2、位置变量
$1,$2
比如:
shell_eg.sh中的内容如下
1.png
执行shell_eg.sh
source shell_eg.sh a b
返回
2.png
上面的命令中$1 指向第一个a,$2指向第二个b。
将shell_eg.sh中的内容修改为
3.png
执行shell_eg.sh
返回
4.png
其中$12,并没有返回第十二个变量值l,而是返回了第一个变量值a再加数字2。
再看另一个例子
abc=123
echo $abcyju
并没有返回123yju,此处将abcyju整体作为变量名,不存在这个变量,返回空
5.png
如果改为
echo ${abc}yju
就可以返回123yju了
返回
6.png
所以将shell_eg.sh中的内容修改为
7.png
执行shell_eg.sh
返回 #能够返回第十二个值l
8.png
在函数里面也可以用
定义test函数,然后执行
9.png
3、环境变量
export定义环境变量
比如:shell_eg.sh中的内容为
10.png
当前bash中ccc变量不存在,执行 shell_eg.sh
返回
chmod +x shell_eg.sh
./shell_eg.sh
返回 # ccc变量不存在,返回空
11.png
在当前bash中定义ccc变量,再次执行shell_eg.sh
ccc=1010
./shell_eg.sh
返回 # ccc变量的值依旧返回空,因为可执行文件会开启一个子bash,可执行文件不像管道一样【子bash会继承父bash中的变量】,ccc=1010是当前bash的,而 shell_eg.sh在另一个bash中执行,所以返回空。
12.png
如果将ccc定义为环境变量,再执行 shell_eg.sh
export ccc
./shell_eg.sh
返回 # 子bash能够读到父bash中的环境变量ccc
13.png
注:如果重新开启一个窗口【开启一个新的bash】,在这个新的bash中无法读到ccc变量,export不能跨bash读,只能在父bash和它的子bash中读取到
4、特殊变量
$#:位置参数个数
$*:参数列表,双引号引用为一个字符串
$@:参数列表,双引号引用为单独的字符串
$$:当前shell的进程号
$BASHPID:真实的进程号【管道中使用的时候】
$?:上一个命令退出状态【0成功;非0失败】
比如,将shell_eg.sh修改为
14.png
执行shell_eg.sh
返回
15.png
$#返回14个参数值,$*和$@都返回了参数列表。
执行完shell_eg.sh,查看$?
返回 # 如果$?返回0,表名上一个命令执行成功,返回非0的结果,
表明上一个命令没有执行成功
16.png
另外还有这种写法
echo ${abc[*]}或者echo ${abc[@]}
返回变量abc的参数列表
17.png
5、局部变量
如函数里面的变量,定义局部变量local 变量名
比如:
函数可以引用在当前bash定义的变量
18.png
在函数内可以定义局部变量,函数内可以输出这个变量,函数外就得不到这个变量了
19.png
在函数内定义的变量【非局部变量】,在函数外也可以得到
20.png