bash的测试和比较

来源:互联网 发布:电脑怎么下载淘宝 编辑:程序博客网 时间:2024/05/10 17:30

比较字串:[ "string1" = "string2" ] 等价于 [ "string1" == "string2" ]

比较整数:[ "num1" -eq "num2" ] 等价于 (( "num1" == "num2" ))

变量值不为空,且变量值中不包含空格的情况下,变量可不加双引号,当然加了双引号也可以

变量值为空或变量值中包含空格的情况下,变量一定要加双引号

或变量没有申明,比如unset var,引用$var,就一定要加双引号

所以把变量统一加上双引号是个明智的选择
[ <...> -a <...> ] 等价于 [ <...> ] && [ <...> ] 等价于 [[ <...> && <...> ]]
[ <...> -o <...> ] 等价于 [ <...> ] || [ <...> ] 等价于 [[ <...> || <...> ]]

Linux Shell 里面比较字符写法:

  -eq   等于

  -ne    不等于

  -gt    大于

  -lt    小于

  -le    小于等于

  -ge   大于等于

  -z    空串

  =    两个字符相等

  !=    两个字符不等

  -n    非空串


通过 < 或 > 测试第一个字符串是否排在第二个字符串的前边或后边,通过一元操作符 - z测试字符串是否为空,而一元操作符 -n 或不加操作符则当字符串为非空时返回真值。

注意:< 和 > 这两个符号同时也是用来做shell重定向,所以你必须通过 \< 和 \> 来反转它的意思。如下列表给出了更多的字符测试的例子。检验一下是不是你所期望样子。
[ian@pinguino ~]$ test "abc" = "def" ;echo $?1[ian@pinguino ~]$ [ "abc" != "def" ];echo $?0[ian@pinguino ~]$ [ "abc" \< "def" ];echo $?0[ian@pinguino ~]$ [ "abc" \> "def" ];echo $?1[ian@pinguino ~]$ [ "abc" \<"abc" ];echo $?1[ian@pinguino ~]$ [ "abc" \> "abc" ];echo $?1


关于[]中的= == 号两边一定要留空格的原因,用下例来说明:
#[ a=b ] && echo OK
OK
咦,为什么会打印出OK?bash会把a=b理解赋值操作,赋值操作永远为真
#[ a==b ] && OK
OK
同理a==b可以理解为a="=b"赋值操作


[root@liyao ~]# a=3

[root@liyao ~]# [ "$a" -eq 3 ] echo 1 || echo 0

-bash: [: missing `]'  # 这里为什么错了呢?那是因为判断完成之后是要输出结果才能去执行下面的命令的

0

[root@liyao ~]# [ "$a" -eq 3 ] && echo 1 || echo 0

1


[root@liyao ~]# (("$a" == 3)) && echo 1 || echo 0

1

[root@liyao ~]# [ "$a" -eq "3" ] && echo 1 || echo 0

1


设置变量为空值

A.    Var=’’

[root@liyao ~]# var=''

[root@liyao ~]# echo $var


B.      abc=""

[root@liyao ~]# abc=""

[root@liyao ~]# echo $abc

 

C.      bao=

[root@liyao ~]# echo $bao


 [root@liyao ~]# var=

[root@liyao ~]# [ -n $var ] && echo OK

OK

 #这个结果错得很明显,为什么呢?[ -n $var ]是先进行了$var变量替换后再进行test测试,变量替换后也就变成了[ -n ],这是个空判断,为真

 [root@liyao ~]# [ -n "$var" ] && echo OK 

# 这样才是正确的结果呀!

 

注意[ -n "" ]与[ -n " " ]是不一样的,[ -n " " ]为真," "是一个空格,它与空值不一样

 

let 命令也可以运行一个或多个算术表达式。它常常用来给算术变量赋值
像 (( )) 一样复合命令 [[ ]] 允许你使用更自然的语法对文件或字符串进行测试。你也可以通过括号和逻辑操作符连接多个测试。
当使用 = 或 != 时 [[ 复合命令也可以针对字符串执行模式匹配操作,针对通配符的匹配如列表7所示。
列表7. 通过 [[ 做匹配tests
[ian@pinguino ~]$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?0[ian@pinguino ~]$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?1[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?1
你甚至也可以通过 [[ 执行算术操作,但是请谨慎,只有是在 (( 复合命令中,< 和 > 操作符会把字符串作为操作对象测试其对应的次序前后。