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

背景:在修改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。
建议:进行字符串比较时使用双中括号[[ ]],语义更加清晰!

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值