Shell中的变量
1、 变量的定义
Shell中的变量在使用之前无需定义,可以在使用的同时创建。不同于C语言等高级语言中的变量,Shell中的变量没有细致的分类,一般情况下,Shell中的一个变量保存一个串,Shell不关心这个串的含义,只有在需要时,才会使用一些工具程序将变量转换为明确的类型。
Shell的变量名由字母、数字和下划线组成,开头只能是字母或下划线。若变量名中出现其它字符,则表示变量名到此前为止。给变量赋值时,等号两边不能有空格,其格式如下:
变量名=值
若要给变量赋空值,可在等号后跟一个换行符,即缺省以上格式中“值”的部分;若字符串中包含空格,必须使用引号(单引号/双引号)引起变量。如定义一个值为“hello itheima”的变量var,可以使用以下格式:
var=’hello itheima’
var=”hello itheima”
Shell中可以使用“readonly”命令将某个变量设置为只读变量,使用方法如下:
readonly 变量名
如要将以上定义的变量var设置为只读,可以使用以下方法:
readonly var
此时若要重新为变量var赋值,则会提示“bash:name:readonly variable”。
2、 变量的引用
Shell中使用“$”符来引用变量,若要输出上文定义的变量,可以使用以下方式:
echo $var
输出的结果为变量var中存储的值。
在定义时,使用双引号或单引号来标注变量皆可,但是在引用时,其效果略有差异。下面通过案例1来展示Shell中变量的引用方法。
案例1:在Shell脚本中定义变量,并进行引用。
1 #!/bin/sh
2 var="hello itheima"
3 echo $var
4 echo "$var"
5 echo '$var'
6 exit 0
案例1中脚本的执行结果如下:
[itheima@localhost ~]$ sh var
hello itheima
hello itheima
$var
案例1的第二行定义了一个变量var,第三行通过echo将其输出,第四行与第五行分别在第三行的基础上多了一个双引号和一对单引号,根据输出结果可以看出:若由双引号引起的字符串中有变量的引用,则会输出变量中存储的值;由单引号引起来的字符串中有变量的引用,则会原样输出。
另外还有许多方式可以引用Shell中的变量,除了获取变量的值,还能获取变量的长度、子串等。Shell中变量常见的引用如表1所示。
表1 Shell变量常见引用
引用格式 | 返回值 | 举例 |
---|---|---|
$var | 返回变量值 | var=”itheima”,$var即itheima。 |
${var} | 返回变量值 | var=”itheima”,${var}即itheima。 |
${#var} | 返回变量长度 | var=”itheima”,${#var}即7。 |
${var:start_index} | 返回从start_index开始到字符串末尾的子串,字符串中的下标从0开始。 | var=”itheima”,${var:2}即heima。 |
${var:start_index:length} | 返回从start_index开始的length个字符。若start_index为负值,表示从末尾往前数start_indexg。 | var=”itheima” ${var:2:3}即hei ${var:0-4:3}即eim |
${var#string} | 返回从左边删除string前的字符串,包括string,匹配最近的字符。 | var=”itheimaitheima”,${var#e}即imaitheima。表示通配符。 |
${var##string} | 返回从左边删除string前的字符串,包括string,匹配最长的字符。 | var=”itheimaitheima”,${var#**e}即ima。 |
${var:=newstring} | 若var为空或未定义,则返回newstring,并把newstring赋给var,否则返回原值。 | var=””,${var:=itheima}即itheima,var=itheima; var=”itheima”,${var:=hello}即itheima。 |
${var:-newstring} | 若var为空或未定义,则返回newstring,否则返回原值。 | var=””,${var:-itheima}即itheima,var仍为空; var=”itheima”,${var:-hello}即itheima。 |
${var:+newstring} | 若var为空,则返回空值,否则返回newstring。 | var=””,${var:+itheima}为空; var=”itheima”,${var:+hello}即hello。 |
${var:?newstring} | 若var为空或未定义,则将newstring写入标准错误流,该语句失败;否则返回原值。 | var=””,${var:?itheima},将“itheima”写入标准错误流,此时输出为:“bash:var:itheima”; var=”itheima”,${var:?hello}即itheima。 |
${var/substring/newstring} | 将var中第一个substring替换为newstring并返回新的var。 | var=”itheima”,${var/ca/xy}即itxyst。 |
${var//ubstring/newstring} | 将var中所有substring替换为newstring并返回新的var。 | var=”itheimaitheima//ca/xy} 即itxystitxyst。 |
3、 变量的分类
Shell中的变量主要分为两种:本地变量和全局变量。
本地变量即在命令行直接定义的变量,也称局部变量,只在当前Shell的生命期中有效,若重新登陆系统,之前定义的变量无法再使用。
全局变量是在Shell脚本下声明的变量,其作用域是整个Shell的生存周期内,只有Shell结束时,该变量的生命期才会结束。
使用set可以查看系统中的所有变量,使用unset可以删除某个变量。
这两种变量是针对脚本的变量。另外Shell中还有一些独特的变量,包括:环境变量、位置变量、标准变量和特殊变量。
① 环境变量
环境变量又称永久变量,用于创建该变量的Shell和从该Shell派生的子Shell或进程中。为了区别于局部变量,环境变量中的字母全部为大写。因为在系统启动时Shell自动登陆,所以Shell中执行的用户进程均为子进程,环境变量可以用于所有用户进程。
环境变量使用“export”设定或创建。若要将一个已存在的本地变量修改为环境变量,可以使用以下方法:
export 变量名
若要创建一个环境变量,则使用以下格式:
export 变量名=值
② 位置变量
位置变量即执行脚本时传入脚本中对应脚本位置的变量,类似函数的参数,引用方法为“$”符加上参数的位置,如:$0、$1、$2,其中$0较为特殊,表示脚本的名称,其余的分别表示脚本中的第一个参数、第二个参数,以此类推。假设当前有一个名为loca的脚本,其中的内容如下:
#!/bin/sh
echo "number of vars:"$#
echo "name of shell script:"$0
echo "first var:"$1
echo "second var:"$2
echo "third var:"$3
执行该脚本时使用的命令与输出的结果如下所示:
[itheima@localhost ~]$ sh loca A B C
number of vars:3
name of shell script:loca
first var:A
second var:B
third var:C
使用shift可以移动位置变量对应的参数,shift每执行一次,参数序列顺序左移一个位置。移出去的参数不可再用。
假如在loca脚本的末尾追加以下内容:
shift
echo "first var:"$1
echo "second var:"$2
echo "third var:"$3
则shift之后的部分执行的结果如下所示:
first var:B
second var:C
third var:
① 标准变量
标准变量也是环境变量,在bash环境建立的时候生成,该变量自动解析,通过查看etc目录下的profile文件可以查看系统中的标准环境变量。
使用env可以查看系统中的环境变量,包括环境变量和标准变量。
② 特殊变量
Shell中还有一些特殊的变量,这些变量及其含义分别如下:
● #。传递到脚本的参数数量。
● ?。前个命令执行情况,0表示成功,其它值表示失败。
● $。脚本运行的当前进程号。
● !。运行脚本最后一个命令。
● *。显示脚本全部参数。
查看这些特殊变量的方法与普通方法相同,都是使用echo与“$”引用。比如查看传递到脚本的参数数量,可以使用以下方法:
echo $#
4、 变量的运算
Shell中变量没有明确的类型,变量值都以字符串的形式存储,但Shell中也可能进行一些算术运算,那么Shell中的算术运算是如何实现的呢?Shell中的运算一般通过两个命令实现:let和expr。下面分别对这两个命令进行讲解。
① let
let命令可以进行算术运算和数值表达式测试。使用let的格式如下:
let 表达式
在命令行中的运算,可以直接套用以上格式实现。下面通过实例来展示let在脚本中的使用方法。
假设现有一名为let的脚本文件,其内容如下:
#!/bin/sh
i=1
echo "i="$i
let i=i+2
echo "i="$i
let "i=i+4"
echo "i="$i
该脚本的执行结果如下:
i=1
i=3
i=7
let命令也可以使用如下形式代替:
((算术表达式))
其在脚本中的使用方法如下:
#!/bin/sh
i=1
((i+=3))
echo "i="$i
该脚本的输出结果如下:
i=4
① expr
expr命令可以对整型变量进行算术运算。使用expr命令时可以使两个数值直接进行运算,例如进行加法运算“3+5”,则可以在命令行输入以下命令:
[itheima@localhost ~]$ expr 3 + 5
8
运算的结果会直接在命令行输出。
若要通过变量的引用进行运算,添加“$”符即可。需要注意的是,在运算符与变量或数据之间需要保留一个空格,否则该命令会将命令后的内容原样输出。
若要在Shell脚本中使用expr命令,需要使用符号“`”(该按键一般位于Tab键之上)将其内嵌到等式当中。假设现在要使用一个变量接收另外两个变量的运算结果,方法如下:
#!/bin/sh
a=10
b=20
value=`expr $a + $b`
echo "value is:$value"
exit 0
执行该脚本,执行的结果如下:
"value is:30"