Linux系統下Shell條件語句之組合測試表達式
首先,我來幫大家回憶下Shell的測試表達式型別
1.整數測試表達式
[ TYPE [option] TYPE ]
其中option有以下幾種選項:
-eq : 判斷相等
-ne :不等
-gt :大於
-lt :小於
-ge :大於等於
-lt :小於等於
2.字串測試表達式
== :判斷是否相同
!= :不同
\> :按照ASCII碼比較是否大於
\< :按照ASCII碼比較是否小於
3.檔案測試表達式
-e :檔案是否存在
-f :是否是普通檔案
-d :是否為目錄
-w :是否可寫
-r :是否可讀
-x :是否可執行
那麼,來說下我們今天的主角組合測試表達式:
組合測試表達式型別如下兩種寫法:
1. [ expression [option] expression ]
-a :全拼為and,也就是兩個表示式的交集為真時返回真,假時返回假
-o :全拼為or,也就是兩個表示式的並集,兩個表示式中一個為真時返回真,全部為假時返回假
2.[ expression ] [option] [ expression ]
&&:兩個表示式的交集為真時返回真,假時返回假
||:兩個表示式的並集,兩個表示式中一個為真時返回真,全部為假時返回假
還有一個關鍵字 !:表示非,下面針對實際列子來作分析:
列如: test.sh檔案
1 #!/bin/bash
2 #
3 if [ $# -gt 3 -a $# -lt 6 ];then
4 echo 'ok'
5 else
6 echo 'no'
7 fi
上面這個是一個Shell指令碼,用來判斷執行該檔案時所帶引數的個數,如果大於3並且小於6時輸出'ok',反之輸出'no'
我們改造一下這個指令碼:
1 #!/bin/bash
2 #
3 if [ ! $# -gt 3 -a $# -lt 6 ];then
4 echo 'ok'
5 else
6 echo 'no'
7 fi
我們在第一個表示式前面加上 '!',那麼執行./test.sh 1 2 3 4 5 6 時,輸出結果是'ok'還是'no'?
如果你的答案是'ok',那麼請一定要看如下內容,如果你的答案是'no',那麼你也可以回顧下知識點
我們來說下大家錯誤的理解:
如果小於等於3或者大於6時輸出'ok',反之輸出'no'
很多人思考錯誤的原因是把'!'當成了整個表示式的作用域,而事實上我們是組合測試表達式,'!'只對第一個表示式起了作用
我們正確的理解:
如果小於等於3並且小於等於6時輸出'ok',反之輸出'no'
現在我們把指令碼改為實現:如果小於等於3或者大於6時輸出'ok',反之輸出'no':
1 #!/bin/bash
2 #
3 if [ ! $# -gt 3 -o ! $# -lt 6 ];then
4 echo 'ok'
5 else
6 echo 'no'
7 fi
注意,將option換成了 -o 代表或者,後面的表示式用'!'取反
好了,通過今天的列子有沒有對組合測試表達式理解呢?