比较字串:[ "string1" = "string2" ] 等价于 [ "string1" == "string2" ]
比较整数:[ "num1" -eq "num2" ] 等价于 (( "num1" == "num2" ))
变量值不为空,且变量值中不包含空格的情况下,变量可不加双引号,当然加了双引号也可以
变量值为空或变量值中包含空格的情况下,变量一定要加双引号
或变量没有申明,比如unset var,引用$var,就一定要加双引号
所以把变量统一加上双引号是个明智的选择
[ <...> -a <...> ] 等价于 [ <...> ] && [ <...> ] 等价于 [[ <...> && <...> ]]
[ <...> -o <...> ] 等价于 [ <...> ] || [ <...> ] 等价于 [[ <...> || <...> ]]
Linux Shell 里面比较字符写法:
-eq
-ne
-gt
-lt
-le
-ge
-z
=
!=
-n
通过 <
[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.
[root@liyao ~]# var=''
[root@liyao ~]# echo $var
B.
[root@liyao ~]# abc=""
[root@liyao ~]# echo $abc
C.
[root@liyao ~]# echo $bao
[root@liyao ~]# [ -n $var ] && echo OK
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
|