[关闭]
@cdmonkey 2014-12-03T07:32:22.000000Z 字数 1571 阅读 1277

条件判断表达式

shell


格式一:test <测试表达式>      格式二:[ <测试表达式> ]

上面的两种格式是等价的,这里推荐使用中括号的书写方式,清晰易读。

格式三:[[ <测试表达式> ]]     格式三是扩展的判断表达式,可以使用通配符进行模式匹配。

一、使用单中括号

此处输入图片的描述

上面的表格中,前四行的EXPRESSION可以代表下面的任何一个表达式。其中:

STRING表示对字符串状态的判断及字符串之间的比较。
INTEGER表示对数值状态的判断及数值之间的比较。
FILE表示对文件状态的判断及文件之间的比较。

  1. #可以直接判断变量值是否为空:
  2. [root@WEB-A1 ~]# [ "$test" ] && echo "Not null" || echo "Null"
  3. Null
  4. [root@WEB-A1 ~]# test=cdmonkey
  5. [root@WEB-A1 ~]# [ "$test" ] && echo "Not null" || echo "Null"
  6. Not null

进行字符串测试时,必须要使用双引号!

  1. #进行数值比较时,双等号(==)等同于-eq运算符:
  2. [root@WEB-A1 ~]# [ 10 == 10 ] && echo "Equal"
  3. Equal
  4. [root@WEB-A1 ~]# [ 10 -eq 10 ] && echo "Equal"
  5. Equal

基本要点:

左右两个中括号与表达式之间都要有空格分隔。
内部操作符与变量之间要有空格:。例如:[ "$A" = "$B" ]
字符串比较中,> & <需要写成\> & \<进行转义。
中括号内的字符串或者${}变量尽量用双引号""括起来,避免引用值未定义或者为空的变量而出错的好办法。
中括号内可以使用–a或者–o进行逻辑运算。

二、使用双中括号

1、使用方法

对于字符串、数整数值及文件的状态判断和两者之间的比较表达式写法,与单括号无异。但是涉及到两个表达式之间的逻辑运算时,写法上会有些差异。
单双中括号逻辑判断表达式的写法小结:

[ Exp1 -a Exp2 ] = [[ Exp1 && Exp2 ]] = [ Exp1 ] && [ Exp2 ] = [[ Exp1 ]] && [[ Exp2 ]]
[ Exp1 -o Exp2 ] = [[ Exp1 || Exp2 ]] = [ Exp1 ] || [ Exp2 ] = [[ Exp1 ]] || [[ Exp2 ]]

基本要点:

左右两个双中括号与表达式之间都要有空格分隔。
内部操作符与变量之间要有空格:。例如:[[ "$A" = "$B" ]]
字符串比较中,可以直接使用> & <无需进行转义。
双中括号内的字符串或者${}如果未使用双引号括起来,则会进行模式和元字符匹配。
双中括号内部可以使用&&以及||来进行逻辑运算。
其他用法同单中括号。

  1. #下面就是模式和元字符匹配:
  2. [root@WEB-A1 ~]# [[ "ab"=a* ]] && echo "OK"
  3. OK

参照上例,当使用==!=运算符时,右边的字符串被用作一个模式而进行模式匹配。而当使用=~运算符时,右边的字符串内容为被匹配的正则表达式。

逻辑运算及关系运算的优先级:

逻辑运算的优先级小于关系运算,即先进行关系运算,最后进行逻辑运算。
逻辑运算符的优先级顺序为:!>&&>||

2、双中括号的优势

  • 双中括号[[...]]是Bash程序语言的关键字,并不是一个命令,双中括号的 结构比单中括号的结构更加通用。在[[]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
  • 支持字符串的模式匹配,使用=~操作符时甚至支持Shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]]其结果为真。双中括号中匹配字符串或通配符,不需要引号。
  • 使用双中开括号条件判断结构,能够防止脚本中的许多逻辑错误。比如,&&||<>操作符能够正常存在于双中括号条件判断结构中,但是如果出现在单中括号结构中的话,会报错。
  • Bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注