@cdmonkey
2014-12-03T15:32:22.000000Z
字数 1571
阅读 1355
shell
格式一:test <测试表达式> 格式二:[ <测试表达式> ]
上面的两种格式是等价的,这里推荐使用中括号的书写方式,清晰易读。
格式三:[[ <测试表达式> ]] 格式三是扩展的判断表达式,可以使用通配符进行模式匹配。
上面的表格中,前四行的EXPRESSION
可以代表下面的任何一个表达式。其中:
STRING
表示对字符串状态的判断及字符串之间的比较。
INTEGER
表示对数值状态的判断及数值之间的比较。
FILE
表示对文件状态的判断及文件之间的比较。
#可以直接判断变量值是否为空:
[root@WEB-A1 ~]# [ "$test" ] && echo "Not null" || echo "Null"
Null
[root@WEB-A1 ~]# test=cdmonkey
[root@WEB-A1 ~]# [ "$test" ] && echo "Not null" || echo "Null"
Not null
进行字符串测试时,必须要使用双引号!
#进行数值比较时,双等号(==)等同于-eq运算符:
[root@WEB-A1 ~]# [ 10 == 10 ] && echo "Equal"
Equal
[root@WEB-A1 ~]# [ 10 -eq 10 ] && echo "Equal"
Equal
基本要点:
左右两个中括号与表达式之间都要有空格分隔。
内部操作符与变量之间要有空格:。例如:[ "$A" = "$B" ]
字符串比较中,> & <
需要写成\> & \<
进行转义。
中括号内的字符串或者${}
变量尽量用双引号""
括起来,避免引用值未定义或者为空的变量而出错的好办法。
中括号内可以使用–a
或者–o
进行逻辑运算。
对于字符串、数整数值及文件的状态判断和两者之间的比较表达式写法,与单括号无异。但是涉及到两个表达式之间的逻辑运算时,写法上会有些差异。
单双中括号逻辑判断表达式的写法小结:
[ Exp1 -a Exp2 ] = [[ Exp1 && Exp2 ]] = [ Exp1 ] && [ Exp2 ] = [[ Exp1 ]] && [[ Exp2 ]]
[ Exp1 -o Exp2 ] = [[ Exp1 || Exp2 ]] = [ Exp1 ] || [ Exp2 ] = [[ Exp1 ]] || [[ Exp2 ]]
基本要点:
左右两个双中括号与表达式之间都要有空格分隔。
内部操作符与变量之间要有空格:。例如:[[ "$A" = "$B" ]]
字符串比较中,可以直接使用> & <
无需进行转义。
双中括号内的字符串或者${}
如果未使用双引号括起来,则会进行模式和元字符匹配。
双中括号内部可以使用&&
以及||
来进行逻辑运算。
其他用法同单中括号。
#下面就是模式和元字符匹配:
[root@WEB-A1 ~]# [[ "ab"=a* ]] && echo "OK"
OK
参照上例,当使用==
及!=
运算符时,右边的字符串被用作一个模式而进行模式匹配。而当使用=~
运算符时,右边的字符串内容为被匹配的正则表达式。
逻辑运算及关系运算的优先级:
逻辑运算的优先级小于关系运算,即先进行关系运算,最后进行逻辑运算。
逻辑运算符的优先级顺序为:!
>&&
>||
- 双中括号
[[...]]
是Bash程序语言的关键字,并不是一个命令,双中括号的 结构比单中括号的结构更加通用。在[[
和]]
之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。- 支持字符串的模式匹配,使用
=~
操作符时甚至支持Shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]]
其结果为真。双中括号中匹配字符串或通配符,不需要引号。- 使用双中开括号条件判断结构,能够防止脚本中的许多逻辑错误。比如,
&&
、||
、<
和>
操作符能够正常存在于双中括号条件判断结构中,但是如果出现在单中括号结构中的话,会报错。- Bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。