1. 程式人生 > >Linux系統下Shell條件語句之組合測試表達式

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 代表或者,後面的表示式用'!'取反

好了,通過今天的列子有沒有對組合測試表達式理解呢?