在运行bash命令的时候,无论成功还是失败都会返回为用户返回一个执行的结果,通常把他叫做退出状态码,每当我们运行命令的时候,退出状态码都会被记录在$?变量中,在命令行echo $?可以查看命令的执行结果,成功的值为0,失败的值为1-255之间的某个值。
注:在shell脚本中,退出状态码记录的是脚本最后一条命令,为方便检查脚本错误,可以使用exit #自定义退出状态码。
shell结构化命令中,如if...then语句、while...do...done语句等的CONDITION条件都是以命令的退出状态码,作为下一条命令是否执行的依据。它们无法测试跟命令的退出状态码无关的条件,例如我们要判断3是否大于5,是没法直接用3>5作为测试条件输出正确结果的,因此我们就需要借助于其它条件测试工具。
bash/shell提供了几个好用的条件测试工具,可用于测试跟命令的退出状态码无关的条件,真为0,假为非0值。(注:与C语言中的条件真假不同,切记!)
条件测试工具有:test EXPRESSION 、[ EXPRESSION ]或[[ EXPRESSION ]](注:EXPRESSION两边都要有空格,否则shell视为语法错误)、命令COMMAND(COMMAND不能放在[]中,在[]内的命令要使用``引用)。
test、[]、[[]]可以用于比较(测试)三类条件:整数比较、字符串比较、文件比较。不同的测试条件,运算符尽不不相同
整数比较运算符:
字符串比较运算符:
文件测试运算符:
逻辑操作运算符:
在shell的结构化命令中,如果CONDITION条件是命令时,要先理清是要用命令的运行结果作为测试条件还是命令的退出状态码作为测试条件。若使用命令运行的结果作为测试条件(实际上,这种情况经常被使用),那么应要使用命令引用,然后在用比较操作符。
#!/bin/bash # 传递一个参数给脚本,此参数为用户名; # 如果用户存在,则执行如下任务 # 如果用户的id号小于500,显示其为管理员或系统用户; # 否则,显示其为普通用户; if id $1 &> /dev/null; then #要使用id -u的运行结果跟500做比较,因此先命令引用再比较操作符 if [ "`id -u $1`" -lt 500 ]; then echo "$1为管理员或系统用户" else echo "$1为普通用户" fi
如果要使用命令的退出状态码作为测试条件,则要先运行命令再使用命令状态码,有两种表现形式:一种是
if CMD; then ... fi
另一种是
CMD if [ $? -eq 0 ]; then ... fi
shell中允许用户使用&&、||、!组合测试条件,进行条件测试。这三个操作符既可以用于连接[]与[],也可以用于连接命令,相当于结构化命令的使用
#!/bin/bash #用ping命令测试172.16.100.X内的所有主机 #将在线的主机输出出来 for i in {1..255} do ping -c1 -w1 172.16.100.$i &> /dev/null [[ $? -eq 0 ]] && echo "172.16.100.$i 在线" done