在Shell编程中,条件测试是经常被使用到的一个知识点,但在条件测试中,多种语法格式也会对初学者产生很多困惑,今天我们就来一起梳理一下条件测试中的那些坑
首先,我们先来看第一个迷惑的地方:
使用单个中括号可以进行条件测试,同时使用双中括号也可以进行条件测试,那么这两种不同的语法格式究竟有什么共同之处?又有什么不同之处呢?
总结起来,可以分为1个相同点,3个不同点
(1)、相同点
当只有一个测试条件时,单括号和双括号是等价的,此时没有任何区别,例如:
[ -f /etc/fstab ] && echo "yes" || echo "no"
[[ -f /etc/fstab ]] && echo "yes" || echo "no"
运行结果如下:
(2)、不同点一
当存在多个测试条件时,单括号和双括号语法格式是有区别的,区别如下:
单括号中,判断条件1和判断条件2之间只能使用-a(与)、-o(或),不能使用&&和||,见下面例子:
num1=200 #定义变量num1,赋值为200
[ -f /etc/fstab -a $num1 -gt 0 ] && echo yes || echo no
[ -f /etc/fstab && $num1 -gt 0 ] && echo yes || echo no
运行结果如下:
(3)、不同点二
双括号中,和单括号正好相反,判断条件1和判断条件2只能使用&&和||,不能使用-a和-o,见下面的例子:
[[ -f /etc/fstab && -d /etc/rc.d/ ]] && echo yes || echo no
[[ -f /etc/fstab -a -d /etc/rc.d/ ]] && echo yes || echo no
运行结果如下:
(4)、不同点三
比较数字大小时,我们知道条件测试的语法如下:
[ $num1 -eq $num2 ] -----num1和num2相等,则为真
[ $num1 -ne $num2 ] -----num1和num2不相等,则为真
[ $num1 -gt $num2 ] -----num1大于num2,则为真
[ $num1 -lt $num2 ] -----num1小于num2,则为真
[ $num1 -ge $num2 ] -----num1大于等于num2,则为真
[ $num1 -le $num2 ] -----num1小于等于num2,则为真
> ----使用大于号
>= ----使用大于等于号
< ----使用小于号
<= ----使用小于等于号
!= ----使用不等于号
== ----使用等于号
单括号中,只能使用-eq、-ne、-gt、-lt、-ge、-le,不能使用>、>=、<、<=、!=、==符号,例如下面的例子:
num1=100 # 定义变量1并赋值为100
num2=200 # 定义变量2并赋值为200
num3=300 # 定义变量3并赋值为300
[ $num1 -gt $num2 ] && echo yes || echo no
[ $num1 > $num2 ] && echo yes || echo no
运行结果如图:
结果分析:上图可以看出,使用-gt和-lt和-eq时,大小比较是符合预期结果的;但使用>和<和==时,有时候大小结果比较是正确的,有时候又是错误的;
结论:在单括号中,务必使用-gt、-lt、-eq、-le、-ge和-ne进行数值大小比较,避免使用>、>=、<、<=、!=、==符号进行数值大小比较,尽管有些情况下是正确的
双括号中,既可以使用-gt、-lt、-eq、-le、-ge和-ne进行数值大小比较,也可以使用>、<、!=、==符号进行数值大小比较,看下面的例子:
Tips:细心的朋友可以发现,在双括号中可以使用>、<、==和!=,但我们没说可以使用>=和<=,下面的例子看下是否可以使用:
结果分析:当使用>=和<=时,报“条件表达式中有语法错误”
结论:在双括号[[ ]]中使用条件测试时,不能直接使用>=和<=符号,不符合语法规定;但可以在双括号(( ))中使用,看下面的例子:
总结:Shell语法中有很多的坑,在学习的过程中一定要善于总结知识点的相同点和不同点,这样才能逐步熟悉Shell编程,在开发大型工具脚本时,才能做到游刃有余