shell变量

变量替换和赋值

变量赋值有两种格式,如下所示:

  1. variable=value
  2. ${ variable=value }

对于变量赋值,说明如下:

  1. 等号两边可以不能有空格,这会影响赋值操作。
  2. 如果值中包含空格,那么需要用双引号引起来。
  3. 变量名可以包含大小写字母、数字、下划线等,不能以数字开头。

例如:进行变量的赋值和替换,注意${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发出警报声
\0xxASCII码0xx所对应的字符

例如,编写脚本zhuanyi.sh,脚本内容如下:

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

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

$’ ‘符号还可以用于变量赋值,执行命令如下:

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

标签