---------------- 二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.
整数比较
-eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a" -ge "$b" ] -lt 小于,如:if [ "$a" -lt "$b" ] -le 小于等于,如:if [ "$a" -le "$b" ] < 小于(需要双括号),如:(("$a" < "$b")) <= 小于等于(需要双括号),如:(("$a" <= "$b")) > 大于(需要双括号),如:(("$a" > "$b")) >= 大于等于(需要双括号),如:(("$a" >= "$b"))
字符串比较 = 等于,如:if [ "$a" = "$b" ] == 等于,如:if [ "$a" == "$b" ],与=等价 注意:==的功能在[[]]和[]中的行为是不同的,如下: 1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true 2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true 3 4 [ $a == z* ] # File globbing 和word splitting将会发生 5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true 一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是. 但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像. != 不等于,如:if [ "$a" != "$b" ] 这个操作符将在[[]]结构中使用模式匹配. < 小于,在ASCII字母顺序下.如: if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ] 注意:在[]结构中"<"需要被转义. > 大于,在ASCII字母顺序下.如: if [[ "$a" > "$b" ]] if [ "$a" \> "$b" ] 注意:在[]结构中">"需要被转义. 具体参考Example 26-11来查看这个操作符应用的例子. -z 字符串为"null".就是长度为0. -n 字符串不为"null" 注意: 使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z 或者就是未用""引用的字符串本身,放到[]结构中(见Example 7-6)虽然一般情况下可 以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.[1]
Example 7-5 数字和字符串比较 ################################Start Script####################################### 1 #!/bin/bash 2 3 a=4 4 b=5 5 6 # 这里的变量a和b既可以当作整型也可以当作是字符串. 7 # 这里在算术比较和字符串比较之间有些混淆, 8 #+ 因为Bash变量并不是强类型的. 9 10 # Bash允许对整型变量操作和比较 11 #+ 当然变量中只包含数字字符. 12 # 但是还是要考虑清楚再做. 13 14 echo 15 16 if [ "$a" -ne "$b" ] 17 then 18 echo "$a is not equal to $b" 19 echo "(arithmetic comparison)" 20 fi 21 22 echo 23 24 if [ "$a" != "$b" ] 25 then 26 echo "$a is not equal to $b." 27 echo "(string comparison)" 28 # "4" != "5" 29 # ASCII 52 != ASCII 53 30 fi 31 32 # 在这个特定的例子中,"-ne"和"!="都可以. 33 34 echo 35 36 exit 0 ################################End Script#########################################
Example 7-6 测试字符串是否为null ################################Start Script####################################### 1 #!/bin/bash 2 # str-test.sh: 测试null字符串和非引用字符串, 3 #+ but not strings and sealing wax, not to mention cabbages and kings . . . 4 #+ 上边这句没看懂 5 # Using if [ ... ] 6 7 8 # 如果一个字符串没被初始化,那么它就没有定义的值(像这种话,总感觉像屁话) 9 # 这种状态叫做"null"(与zero不同) 10 11 if [ -n $string1 ] # $string1 没被声明和初始化 12 then 13 echo "String \"string1\" is not null." 14 else 15 echo "String \"string1\" is null." 16 fi 17 # 错误的结果. 18 # 显示$string1为非空,虽然他没被初始化. 19 20 21 echo 22 23 24 # 让我们再试一下. 25 26 if [ -n "$string1" ] # 这次$string1被引用了. 27 then 28 echo "String \"string1\" is not null." 29 else 30 echo "String \"string1\" is null." 31 fi # ""的字符串在[]结构中 32 33 34 echo 35 36 37 if [ $string1 ] # 这次$string1变成"裸体"的了 38 then 39 echo "String \"string1\" is not null." 40 else 41 echo "String \"string1\" is null." 42 fi 43 # 这工作得很好. 44 # 这个[]test操作检测string是否为null. 45 # 然而,使用("$string1")是一种很好的习惯 46 # 47 # As Stephane Chazelas points out, 48 # if [ $string1 ] 有1个参数 "]" 49 # if [ "$string1" ] 有2个参数,空的"$string1"和"]" 50 51 52 53 echo 54 55 56 57 string1=initialized 58 59 if [ $string1 ] # 再来,$string1"裸体了" 60 then 61 echo "String \"string1\" is not null." 62 else 63 echo "String \"string1\" is null." 64 fi 65 # 再来,给出了正确的结果. 66 # 不过怎么说("$string1")还是好很多,因为. . . 67 68 69 string1="a = b" 70 71 if [ $string1 ] # 再来,$string1 再次裸体了. 72 then 73 echo "String \"string1\" is not null." 74 else 75 echo "String \"string1\" is null." 76 fi 77 # 非引用的"$string1"现在给出了一个错误的结果! 78 79 exit 0 80 # Thank you, also, Florian Wisser, for the "heads-up". ################################End Script#########################################
Example 7-7 zmore ################################Start Script####################################### 1 #!/bin/bash 2 # zmore 3 4 #使用'more'来查看gzip文件 5 6 NOARGS=65 7 NOTFOUND=66 8 NOTGZIP=67 9 10 if [ $# -eq 0 ] # 与 if [ -z "$1" ]同样的效果 11 # 应该是说前边的那句注释有问题,$1是可以存在的,比如:zmore "" arg2 arg3 12 then 13 echo "Usage: `basename $0` filename" >&2 14 # 错误消息到stderr 15 exit $NOARGS 16 # 脚本返回65作为退出码. 17 fi 18 19 filename=$1 20 21 if [ ! -f "$filename" ] # 将$filename ""起来,来允许可能的空白 22 then 23 echo "File $filename not found!" >&2 24 # 错误消息到stderr 25 exit $NOTFOUND 26 fi 27 28 if [ ${filename##*.} != "gz" ] 29 # 在变量替换中使用中括号 30 then 31 echo "File $1 is not a gzipped file!" 32 exit $NOTGZIP 33 fi 34 35 zcat $1 | more 36 37 # 使用过滤命令'more' 38 # 如果你想的话也可使用'less' 39 40 41 exit $? # 脚本将返回pipe的结果作为退出码 42 # 事实上,不用非的有"exit $?",但是不管怎么说,有了这句,能正规一些 43 # 将最后一句命令的执行状态作为退出码返回 ################################End Script#########################################
混合比较
-a 逻辑与 exp1 -a exp2 如果exp1和exp2都为true的话,这个表达式将返回true
-o 逻辑或 exp1 -o exp2 如果exp1和exp2中有一个为true的话,那么这个表达式就返回true
这与Bash的比较操作符&&和||很相像.在[[]]中使用它. 1 [[ condition1 && condition2 ]] -o和-a一般都是和test命令或者是[]一起工作. 1 if [ "$exp1" -a "$exp2" ]
请参考Example 8-3,Example 26-16和Example A-28来查看混合比较操作的行为.
注意事项: [1] S.C.(这家伙是个人名)指出,在使用混合比较的时候即使"$var"也可能会产生问题. 如果$string为空的话,[ -n "$string" -o "$a" = "$b" ]可能在某些版本的Bash中 会有问题.为了附加一个额外的字符到可能的空变量中的一种安全的办法是, [ "x$string" != x -o "x$a" = "x$b" ](the "x's" cancel out)(没看懂). cancel out是抵消的意思. |