在shell编程中,通过if命令来实现判断语句;if命令中的判断条件则通过test命令来完成。因此,本文将集中介绍if命令和test命令的使用方法。
1. 退出状态
对于每一条命令而言,它在执行完毕后就有相应的返回状态,这个返回状态保存在特殊变量?中。当一条命令成功执行后,该命令的返回状态为0;否则,该命令的返回状态为非0。比如:
edsionte@edsionte-laptop:~/shelltest$ cat nothisfile cat: nothisfile: 没有那个文件或目录 edsionte@edsionte-laptop:~/shelltest$ echo $? 1 edsionte@edsionte-laptop:~/shelltest$ echo $? 0
由于cat命令执行失败,通过echo命令可获得cat命令的返回值为1;再次echo特殊变量?的值可以看到返回状态为0,这正好说明了第一次echo命令成功执行。
2.if命令
if命令的的使用方法如下:
if command_t then commands fi
command_t是用来进行逻辑判断的命令。如果该命令的的返回状态为0,则执行then和fi之间的命令。除了上述的基本使用方法外,if命令还有以下两种结构。
//if-else if command_t then commands else commands fi //if-elif-else if command_t1 then commands elif command_t2 then commands else commands fi
上述两种结构理解起来不会很难,其使用方法可参看test命令中的举例。
3. test命令
正如本文一开始说的那样,test命令常用作if命令中的逻辑判断。其使用方法如下:
test expression
其中expression表示要测试的条件,如果该条件为真,则test命令的返回状态为0;否则返回非0。
字符串操作符
操作符=用来判断两个字符串是否相等,其使用方法如下: test str1 = str2 注意test命令的三个参数必须用空格隔开,这样test才能正确的接收到三个参数。现在,我们可以改进上文的lu程序,增加参数判断功能:
edsionte@edsionte-laptop:~/shelltest$ cat lu # look someone up in the info book if test "$1" = "" then echo "usage: ./lu arg" else grep "^$1:" info fi edsionte@edsionte-laptop:~/shelltest$ ./lu usage: ./lu arg
如果未输入参数,则提示使用方法。由于=用来判断两个字符串是否相等,因此该判断符对于字符串中的空格很敏感。比如:
edsionte@edsionte-laptop:~/shelltest$ name="edsionte " edsionte@edsionte-laptop:~/shelltest$ test "$name" = "edsionte" edsionte@edsionte-laptop:~/shelltest$ echo $? 1
由于对name赋值时edsionte后有一个空格,因此这两个字符串不相等。test命令的返回值为1。 在上述的test命令中,只要涉及到对变量的引用都会加上双引号。通过下述举例可以看到这种使用的好处。
edsionte@edsionte-laptop:~/shelltest$ name= edsionte@edsionte-laptop:~/shelltest$ test $name = "edsionte" bash: test: =: 需要单个参数 edsionte@edsionte-laptop:~/shelltest$ test "$name" = "edsionte" edsionte@edsionte-laptop:~/shelltest$ echo $? 1
当给name赋值为空时,如果没有使用双引号引用该变量,则shell在执行test命令时会认为缺少了第一个字符串参数。
另一种格式
由于if命令在shell编程中频繁使用,因此也诞生了一种简易的test使用格式:
[ expression ]
其实上述格式中的[和]就等价于命令名。值得注意的是,expression前后需要和相应中括号用空格隔开。比如上述举例:
edsionte@edsionte-laptop:~/shelltest$ [ "$name" = "edsionte" ] edsionte@edsionte-laptop:~/shelltest$ echo $? 1
整数操作符
test命令除了有对字符串进行的操作符外,还有一些列针对整数的操作符。下列的文字描述只针对返回值为0时的情况:
int1 -eq int2 :int1等于int2
int1 -ne int2 :int1不等于int2
int1 -ge int2 :int1大于等于int2
int1 -gt int2 :int1大于int2
int1 -le int2 :int1小于等于int2
int1 -lt int2 :int1小于int2
如果在上述判断条件前加上逻辑非符号!,则表示对当前返回值取反。也就是说,如果该判断条件不满足时,返回值为0。比如:
edsionte@edsionte-laptop:~/shelltest$ [ 1 -ge 3 ] edsionte@edsionte-laptop:~/shelltest$ echo $? 1 edsionte@edsionte-laptop:~/shelltest$ [ ! 1 -ge 3 ] edsionte@edsionte-laptop:~/shelltest$ echo $? 0
我们还可以这么改进上文中的lu程序:
edsionte@edsionte-laptop:~/shelltest$ ./lu usage: ./lu arg edsionte@edsionte-laptop:~/shelltest$ cat lu # look someone up in the info book if [ $# -ne 1 ] then echo "usage: ./lu arg" else grep "^$1:" info fi
逻辑操作符
上述所举的例子都是针对一条测试条件的,如果test命令的测试条件超过一条时,就应该使用逻辑操作符-a和-o。前者标示逻辑与,而这标示逻辑或。其使用方法可参考下例:
edsionte@edsionte-laptop:~/shelltest$ [ ! 1 -ge 3 -a 3 -ge 1 ] edsionte@edsionte-laptop:~/shelltest$ echo $? 0 edsionte@edsionte-laptop:~/shelltest$ [ ! 1 -ge 3 -a 3 -le 1 ] edsionte@edsionte-laptop:~/shelltest$ echo $? 1 edsionte@edsionte-laptop:~/shelltest$ [ ! 1 -ge 3 -o 3 -le 1 ] edsionte@edsionte-laptop:~/shelltest$ echo $? 0
关于test命令更多的使用方法可以参考man手册。