shell中条件判断单双中括号&数值比较&字符串比较

牧云@^-^@ 提交于 2019-12-26 16:00:24

背景:在修改centreon监控脚本的时候发现shell脚本中if判断条件使用的几点疑问,遂记录。

条件判断中的单双中括号

样例1如下:判断当前小时(24小时制)是否大于2点?

time=`date +%H`
if [ $time -gt "02"]
then
	echo "yes"
else
	echo "no"
fi	

Q: -gt用于数值大小比较,为什么在这里没有报错?

单中括号[ ]

条件判断中的[ ]是shell中内置命令test的另一种形式,两者等同于:

if test 1 -gt 2
----------------
if [ 1 -gt 2 ]

要点如下:

  • 数值比较支持诸如-lt,-gt等符号,
  • 字符串比较仅支持=,!=两种比较方式,若需要使用>,<则需要进行转义为\>,\<,样例2如下:
if [ "a" \> "a" ]
then 
	echo "yes"
else 
	echo "no"
fi
# 打印 no

双中括号[[ ]]

双中括号为shell内置关键字,语义范围较但括号更为广泛,例如支持||,&&等逻辑运算符,且支持正则通配,样例3(通配)如下:

a="zoo"
[[ $a == z* ]] # 这里采用的是模式匹配即z开头
echo $? # 状态码为0即为true
[[ $a == "z*" ]] # 这里采用的是字符匹配即匹配z*
echo $? # 状态码为1即为false

样例4(正则)如下:

[[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
# 检查ip地址是否合法

样例2改写如下:

if [[ "a" > "a" ]]
then 
	echo "yes"
else 
	echo "no"
fi
# 打印 no

故在条件判断中字符串比较更适合使用[[ ]]来进行逻辑判断


回到最开始的疑问,样例1可被改写为:

time=`date +%H`
if [[ $time > "02" ]]
then
	echo "yes"
else
	echo "no"	
fi

至于为什么使用样例1不会出错,样例5测试如下:

time=`date +%H`
if [ $time -gt "0a" ]
then
	echo "yes"
else
	echo "no"
fi	
# 报错:integer expression expected 

推测如下:在使用-gt等比较符号时,shell隐式地将前后的对比的参数进行了类型转换,如"001"会转换为数字1。
建议:进行字符串比较时使用双中括号[[ ]],语义更加清晰!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!