背景:在修改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。
建议:进行字符串比较时使用双中括号[[ ]],语义更加清晰!
来源:CSDN
作者:maborosii
链接:https://blog.csdn.net/maborosii/article/details/103714248