shell编程中的判断语句

本文转自:http://edsionte.com/techblog/archives/2341

在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手册。