shell变量
变量替换和赋值
变量赋值有两种格式,如下所示:
- variable=value
- ${ variable=value }
对于变量赋值,说明如下:
- 等号两边可以不能有空格,这会影响赋值操作。
- 如果值中包含空格,那么需要用双引号引起来。
- 变量名可以包含大小写字母、数字、下划线等,不能以数字开头。
例如:进行变量的赋值和替换,注意${variable}中不能有空格,否则报错,执行命令如下:

如果值中包含空格,此时需要使用双引号引起来,如图:

使用unset可以清除变量的值,如图:

变量赋值的模式及其含义如下
| 模式 | 含义 |
| variable=value | 将value的值赋值给variable |
| variable+value | 对已赋值的variable,重设其值 |
| variable?value或variable:?value | 对未赋值的variable,显示错误信息 |
| variable:=value | 对未赋值的variable,将value值赋给它 |
| variable:-value | 对未赋值的variable,将value值赋给它 ,但是value的值不存储到variable对应的地址空间 |
例如:将变量var赋值为hello ,然后执行命令如下:

从上图中可以看到,var已经赋值,因此后来的:=以及:-命令都不会对它重新赋值
下面使用unset命令将var的值清除,然后再次使用:=以及:-命令,如图:

从上图中可以看出,清除var的值后,使用:-可以重新对var进行赋值,但是并没有将值写入地址空间,因此echo $var的值为空,而使用:=赋值后,再次执行$var看到可以打印值,值已经写入地址空间,此为:=与:-的区别
注意:在使用:=与:-的时候,需要用花括号括起来,否则shell将会把var:=world当作变量名处理
将变量设置为只读后,如果再次对变量进行赋值,将提示错误,如图:

执行命令readonly可以查看系统中所有的只读变量,如图:

环境变量:
定义环境变量与声明环境变量,执行命令如下:
varr=/usr/local/abc #定义环境变量
export varr #声明环境变量
unset varr #清除环境变量
打印PATH变量的值,执行命令如下:

如果要在PATH中添加新的目录,可以执行命令如下:

位置参数:
位置参数是一种特殊的shell变量,用于像shell脚本传递参数,其中$1表示第一个参数、$2表示第二个参数,以此类推,$0表示脚本名称,从$10开始需要使用花括号括起来,如${10}、${11}…….., $*和$@一样,表示从$1开始的全部参数
例如,有一个脚本内容如下:


shell特殊位置参数及其含义
| 特殊位置参数 | 含义 |
| $# | 传递到脚本的参数数量 |
| $@和$* | 传递到脚本的所有参数 |
| $$ | 脚本运行的进程号 |
| $? | 退出状态,0表示退出正常,非0表示错误 |
修改上面的脚本,添加内容如下:

再次执行脚本,可以看到输出内容如下:

引用:
引用符号名称及其意义如下
| 符号 | 名称 | 含义 |
| ” “ | 双引号 | 引用除美元符号$、反引号“和反斜线之外的所有字符 |
| ‘ ‘ | 单引号 | 引用所有字符 |
| “ | 反引号 | shell将反引号中的内容解释为系统命令 |
| \ | 反斜线 | 转义符,屏蔽下一字符的特殊含义 |
全引用和部分引用
双引号引用除美元符号$、反引号和反斜线之外的所有字符,即($)、(“)、(\)在双引号中任被解释成特殊含义,双引号中$符号可以引用变量,利用双引号可以防止字符串分割,保留变量空格
例如,现有以脚本文件test.sh,内容如下:

脚本执行后的输出内容如下:

由上图中可以看到,第一个变量var的值通过”$var”或者$var打印出来的内容相同,第二个变量为字符串,其中hello与world之间存在三个空格,在打印时,”$varr”保留了原空格信息,而$var则只是有一个空格,导致字符串被分割。
单引号中的字符除了单引号本身外,其余都被解释成普通字符,单引号不在具备引用变量的功能,因此单引号为全引用,双引号为部分引用。
例如:现定义变量varr的值为hello ,通过单引号以及双引号分别打印,如图:

命令替换:
命令替换是指将命令的标准输出作为值赋值某个变量,有两种方式进行命令替换,一种是使用反引号,一种是通过$(),如图:

尽管$()与反引号在命令替换上是等价的,但是$()是支持嵌套的,如图:

上图中的expr length表示计算字符串长度,后面的双引号中返回test.sh脚本的第1行,因此,最终计算字符串长度为11
反引号与$()在处理双反斜线的时候还存在区别,反引号处理结果为空格,而$()处理结果为反斜线,如图:

转义:
反斜线(\)表示转义,当反斜线后面出现特殊字符的时候,将会被转义成普通字符,其中特殊字符包括正则表达式中的元字符,也包括重定向符号、管道命令等,如图:

转义字符后跟字母表示特殊含义
| 符号 | 含义 |
| \n | 新的一行(换行) |
| \r | 返回 |
| \t | 表示Tab键 |
| \v或\f | 换行,但是光标仍然停留在原来位置 |
| \b | 退格键 |
| \a | 发出警报声 |
| \0xx | ASCII码0xx所对应的字符 |
例如,编写脚本zhuanyi.sh,脚本内容如下:

脚本执行后输出内容如下:

从上述执行结果可以看到,echo 如果不加-e参数,\t\\n等将原样输出\t\n,如果加了-e将这些字符解释为特殊含义,$’ ‘ 与-e的作用等价,可替换使用
$’ ‘符号还可以用于变量赋值,执行命令如下:

注意:echo 命令有两个选项,-e和-n ,其中-e表示将转义字符后面跟的特殊字符解释成特殊含义,-n表示输出文字后不换行,如果不加-n,echo 默认是输出文本后换行。



