继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Shell脚本编程之条件测试中[]和[[]]的那些坑

2018-09-25 15:23:134767浏览

酷田

3实战 · 10手记 · 3推荐
TA的实战

        在Shell编程中,条件测试是经常被使用到的一个知识点,但在条件测试中,多种语法格式也会对初学者产生很多困惑,今天我们就来一起梳理一下条件测试中的那些坑

        首先,我们先来看第一个迷惑的地方:

                使用单个中括号可以进行条件测试,同时使用双中括号也可以进行条件测试,那么这两种不同的语法格式究竟有什么共同之处?又有什么不同之处呢?

                总结起来,可以分为1个相同点,3个不同点

                (1)、相同点

                当只有一个测试条件时,单括号和双括号是等价的,此时没有任何区别,例如:

                [ -f  /etc/fstab ]  &&  echo  "yes"  ||  echo  "no"

                [[ -f  /etc/fstab ]]  &&  echo  "yes"  ||  echo  "no"

                运行结果如下:

                https://img4.mukewang.com/5ba9d5e50001877c09130136.jpg

                (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

                运行结果如下:

                https://img3.mukewang.com/5ba9d8b500017ee810240155.jpg

                (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 

                运行结果如下:

                https://img2.mukewang.com/5ba9d97a0001963710090149.jpg

                (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

                运行结果如图:

                https://img4.mukewang.com/5ba9dd8c0001f7cc08340326.jpg

                结果分析:上图可以看出,使用-gt和-lt和-eq时,大小比较是符合预期结果的;但使用>和<和==时,有时候大小结果比较是正确的,有时候又是错误的;

                结论:在单括号中,务必使用-gt、-lt、-eq、-le、-ge和-ne进行数值大小比较,避免使用>、>=、<、<=、!=、==符号进行数值大小比较,尽管有些情况下是正确的

                双括号中,既可以使用-gt、-lt、-eq、-le、-ge和-ne进行数值大小比较,也可以使用>、<、!=、==符号进行数值大小比较,看下面的例子:

                https://img.mukewang.com/5ba9e09c00018ae108010385.jpg

                Tips:细心的朋友可以发现,在双括号中可以使用>、<、==和!=,但我们没说可以使用>=和<=,下面的例子看下是否可以使用:

                https://img2.mukewang.com/5ba9e1010001761408060172.jpg

                结果分析:当使用>=和<=时,报“条件表达式中有语法错误”

                结论:在双括号[[ ]]中使用条件测试时,不能直接使用>=和<=符号,不符合语法规定;但可以在双括号(( ))中使用,看下面的例子:

                https://img.mukewang.com/5ba9e19700015d5608010223.jpg

                总结:Shell语法中有很多的坑,在学习的过程中一定要善于总结知识点的相同点和不同点,这样才能逐步熟悉Shell编程,在开发大型工具脚本时,才能做到游刃有余

打开App,阅读手记
4人推荐
发表评论
随时随地看视频慕课网APP