目录
一、变量引用(单引号、双引号、反引号、$、${ }、$( )区别)
1、普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell 进程均无效
3、本地变量:生效范围为当前shell进程中某代码片断,通常指函数
5、位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
一、变量引用(单引号、双引号、反引号、$、${ }、$( )区别)
1、$:获取变量的值
2、单引号:'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串。
3、双引号:"$name" 弱引用,其中的变量引用会被替换为变量值。
4、反引号:命令引用,反引号中必须是命令,不然会报错command not found
5、${ }: 与$符的功能基本一样,获取变量的值。需要注意的是如果变量后面紧跟了字符,一定要用${ }将其括起来,要不然程序会产生错误。另外,${ }还可以用来赋予变量默认值:${var:-default }是一种使用默认值的形式,如果 var 未定义或为空,则使用 default。
6、$( ):与反引号的功能基本一样,并且推荐使用$( )
二、变量定义
介绍变量前,先介绍些知识点,方便做实验:
a、当我们运行一个脚本的时候,这个脚本实际上是在子进程中运行的。我们可以利用echo $BASHPID来输出当前进程编号进行验证。另外,脚本会在运行完后销毁进程,所以需要利用sleep函数来方便我们进行观察进程。
输入pstree -p查看进程树,明显可以看到a.sh是当前进程(165344)的一个子进程。
b、unset命令可以用来删除变量
c、注意:给变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除。
1、普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell 进程均无效
对于普通变量可以做以下实验:
在当前shell进程中定义1个普通变量a,在脚本(子进程)中进行引用,发现并不能引用。这恰恰说明了普通变量生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell 进程均无效。
2、环境变量:生效范围为当前shell进程及其子进程。
利用export将普通变量设置为环境变量,发现子进程能引用父进程的变量了。这就是环境变量,生效范围为当前shell进程及其子进程
另外,我们可以通过env命令查看系统中所有的环境变量。
3、本地变量:生效范围为当前shell进程中某代码片断,通常指函数
4、只读变量:只能声明定义,但后续不能修改和删除
利用readonly name 或 declare -r name声明只读变量。变量都只读了,其实也就可以把他理解为常量了,只读变量声明后是不允许做任何删除过更改的,包括unset命令也不行,退出中断后变量会自动删除。
5、位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
$1,$2,....:对应第1个、第2个等参数,shift [n]换位置,需要注意的是数字再超过10 以后要括起来,比如${10}、${11}......
$0:命令本身,包括路径
$*:传递给脚本的所有参数,全部参数合为一个字符串
$@:传递给脚本的所有参数,每个参数为独立字符串
$#:传递给脚本的参数的个数
PS:$@ $* 只在被双引号包起来的时候才会有差异