shell test操作运算符

4.4 控制结构

在shell脚本中,使用控制结构就可以控制Linux命令的执行。使用控制结构,可以重复执行命令,或者选择特定的命令。控制结构包含两个主要的组件:测试操作(test)和命令。如果测试操作成功,则命令就会执行。这样的话,就可以使用控制结构来决定是否执行选定的命令。

存在两种不同类型的控制结构:循环和条件。循环结构会重复执行命令,而条件结构会在特定条件满足时执行命令。

BASH Shell有三种循环控制结构:while、for和for-in,两种条件控制结构:if和case。控制结构把Linux命令执行结果作为测试。

所有的Linux命令在执行结束后都会返回一个退出状态。如果某命令成功执行,退出状态将是0。如果因为某种原因该命令执行失败,则退出状态是表示失败类型的一个正值。控制结构会检查Linux命令的退出状态是0,还是其他值。对于if和while控制结构,如果退出状态是0,则说明该命令被成功执行,控制结构会继续。

4.4.1 test操作

借助于test命令,可以比较整数字符串,甚至执行逻辑操作。命令由关键字test,以及被比较值组成;被比较数值之间使用一个选项分隔开,其中该选项指定采用什么样的方法进行比较。选项可以被认为是一个操作符,但是在书写的时候它和其他的选项一样由一个减号加上字符代码组成。例如,选项-eq代表相等比较。不过两个字符串比较时使用一个操作符来代替选项。当比较两个字符串是否相等时,应该使用等于号(=)。

表40-2列出在test所使用的所有的选项和操作符。

test命令的语法如下所示:

test value -option value
test stringstring = string

表4-1 BASH Shell test操作符

整数比较 功能
-gt 大于测试
-lt 小于测试
-ge 大于或等于测试
-le 小于或等于测试
-eq 等于测试
-ne 不等于测试
字符串比较
-z 空字符串测试
= 字符串相等测试
!= 字符串不相等测试
逻辑操作
-a 逻辑与测试
-o 逻辑或测试
! 逻辑非测试
文件测试
-f 测试文件是否存在,并且是否为一个常规文件
-s 测试文件是否为空
-r 测试文件是否为可读的
-w 测试文件是否允许写入和修改
-x 测试文件是否为可执行的
-d 测试文件名是否为目录名

在下面的范例中,用户比较两个整数值,以判断是否相等。这时候,需要使用表示相等的选项-eq。检查test命令的退出状态,得到测试操作的执行结果。shell的特殊变量 $? 会保存最新执行的Linux命令的退出状态。

$ num=5
$ test $num -eq 10
$ echo $?
1

在test命令中除了使用关键字test以外,还可以使用方括号。命令test $greeting = “hi”也可以写成

$ [ $greeting = "hi"]

类似地,test命令test $num -eq 10也可以写成

$ [$num -eq 10]

方括号自身必须被空白包围:空格符、TAB或换行符。没有空格将无效。

4.4.3 循环控制结构

while循环控制结构会重复执行命令。一个while循环控制结构由关键字while和其后的一个Linux命令组成。关键字do在下一行中。循环结构的结尾是关键字done。while循环结构中Linux命令通常是括号括起来的测试命令。

for-in结构被设计用来顺序地引用值的列表。该结构有两个操作数:一个变量和一个数值列表。在for-in结构,列表中的数值逐个被分配给变量。像like命令,for-in结构是一种循环。在每次循环中,列表中的下一个值被分配给该变量。当到达列表的结尾时,循环处理结束。像while循环一样,for-in循环的主体以关键字do开始,以关键字done结束。在下面范例中,cbackup脚本会创建每个文件的副本,并放在名为sourcebak的目录中。请注意,使用特殊字符*会产生扩展名为*.c的文件名列表。

cbackup
for backfile in *.c
do
cp $backfile sourcebak/$backfile
echo $backfile
done

该程序的运行结果范例如下:

$ cbackup
io.c
lib.c
main.c
$

在for结构中,如果没有指定的值列表,就会把命令行参数作为值列表。当shell文件被调用时,命令行上参数就会成为for命令所引用的值列表。for命令中所使用的变量会顺序地自动设置为每个参数值。当第一次处理这个循环时,该变量就会被设置为第一个参数的值。第二次处理时,该变量就会设置为第二个参数的值,依此类推。

Leave a Reply