二元比较操作符用来比较两个变量或数字. 注意整数比较与字符串比较的区别.
等于
if [ "$a" -eq "$b" ]
不等于
if [ "$a" -ne "$b" ]
大于
if [ "$a" -gt "$b" ]
大于等于
if [ "$a" -ge "$b" ]
小于
if [ "$a" -lt "$b" ]
小于等于
if [ "$a" -le "$b" ]
小于(在双括号中使用)
(("$a" < "$b"))
小于等于(在双括号中使用)
(("$a" <= "$b"))
大于(在双括号中使用)
(("$a" > "$b"))
大于等于(在双括号中使用)
(("$a" >= "$b"))
等于
if [ "$a" = "$b" ]
等于
if [ "$a" == "$b" ]
与=等价.
==比较操作符在双中括号对和单中括号对中的行为是不同的.
|
不等号
if [ "$a" != "$b" ]
这个操作符将在[[ ... ]]结构中使用模式匹配.
小于, 按照ASCII字符进行排序
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意"<"使用在[ ]结构中的时候需要被转义.
大于, 按照ASCII字符进行排序
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意">"使用在[ ]结构中的时候需要被转义.
参考例子 26-11, 这个例子展示了如何使用这个比较操作符.
字符串为"null", 意思就是字符串长度为零
字符串不为"null".
例子 7-5. 算术比较与字符串比较
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 |
例子 7-6. 检查字符串是否为null
1 #!/bin/bash 2 # str-test.sh: 检查null字符串和未引用的字符串, 3 #+ but not strings and sealing wax, not to mention cabbages and kings . . . 4 #+ 但不是字符串和封蜡, 也并没有提到卷心菜和国王. . . ??? (没看懂, rojy bug) 5 6 # 使用 if [ ... ] 7 8 9 # 如果字符串并没有被初始化, 那么它里面的值未定义. 10 # 这种状态被称为"null" (注意这与零值不同). 11 12 if [ -n $string1 ] # $string1 没有被声明和初始化. 13 then 14 echo "String \"string1\" is not null." 15 else 16 echo "String \"string1\" is null." 17 fi 18 # 错误的结果. 19 # 显示$string1为非null, 虽然这个变量并没有被初始化. 20 21 22 echo 23 24 25 # 让我们再试一下. 26 27 if [ -n "$string1" ] # 这次$string1被引号扩起来了. 28 then 29 echo "String \"string1\" is not null." 30 else 31 echo "String \"string1\" is null." 32 fi # 注意一定要将引用的字符放到中括号结构中! 33 34 35 echo 36 37 38 if [ $string1 ] # 这次, 就一个$string1, 什么都不加. 39 then 40 echo "String \"string1\" is not null." 41 else 42 echo "String \"string1\" is null." 43 fi 44 # 这种情况运行的非常好. 45 # [ ] 测试操作符能够独立检查string是否为null. 46 # 然而, 使用("$string1")是一种非常好的习惯. 47 # 48 # 就像Stephane Chazelas所指出的, 49 # if [ $string1 ] 只有一个参数, "]" 50 # if [ "$string1" ] 有两个参数, 一个是空的"$string1", 另一个是"]" 51 52 53 54 echo 55 56 57 58 string1=initialized 59 60 if [ $string1 ] # 再来, 还是只有$string1, 什么都不加. 61 then 62 echo "String \"string1\" is not null." 63 else 64 echo "String \"string1\" is null." 65 fi 66 # 再来试一下, 给出了正确的结果. 67 # 再强调一下, 使用引用的("$string1")还是更好一些, 原因我们上边已经说过了. 68 69 70 string1="a = b" 71 72 if [ $string1 ] # 再来, 还是只有$string1, 什么都不加. 73 then 74 echo "String \"string1\" is not null." 75 else 76 echo "String \"string1\" is null." 77 fi 78 # 未引用的"$string1", 这回给出了错误的结果! 79 80 exit 0 81 # 也感谢Florian Wisser, 给出了上面这个"足智多谋"的例子. |
例子 7-7. zmore
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 $? # 脚本将把管道的退出状态作为返回值. 42 # 事实上, 也不一定非要加上"exit $?", 因为在任何情况下, 43 # 脚本都会将最后一条命令的退出状态作为返回值. |
逻辑与
exp1 -a exp2 如果表达式exp1和exp2都为真的话, 那么结果为真.
逻辑或
exp1 -o exp2 如果表达式exp1和exp2中至少有一个为真的话, 那么结果为真.
这与Bash中的比较操作符&&和||非常相像, 但是这个两个操作符是用在双中括号结构中的.
1 [[ condition1 && condition2 ]] |
1 if [ "$exp1" -a "$exp2" ] |
[1] | 就像S.C.所指出的那样, 在一个混合测试中,
即使使用引用的字符串变量也可能还不够.
如果 |