next up previous contents
Next: for loop Up: 流程控制與測試條件 Previous: 測試條件   Contents

if 條件判斷

if test;then cmd1; elif test; cmd2; else cmd3 fi
      if test
      then
        cmd1
        ...
      elif test
        cmd2
        ...
      else
        cmd3
        ...
      fi
同樣注意寫成一行時的分號位置。尤其在寫Makefile時會用到。 另外他的else if是elif, 跟C的else if不一樣喔。

另外有種簡單的if用法
    [ "$VERBOSE" ] && echo 'everything'  && 表示傳回true時執行&&後面動作
    [ "$VERBOSE" ] || echo 'nothing'     || 表示傳回false時執行||後面動作
這邊有點要注意
    [ "$var" ]
    如果是空字串傳回false 這其實很像
    [ -n "$var" ]
通常括號裡面是這些判斷的方式,但其實每次他如果看到有命令代換的式子, 會去執行一次命令, 但是記住他不是C,可以在if while裡面執行式子(expression)還回return值, 他所還回來的是命令的standard out,所以不可以嘗試著同時執行命令, 然後要判斷執行成功與否,來決定下一步怎麼作。 不過有的命令成功了會在standard out 印出一堆字串,我們可以利用這樣的行為來 作判斷,例如
      [ "$(find . -name gyoza.txt)" ] && echo "I Find It !!!"
用$(cmd) 等於用`cmd`,如果找到了,會印出這個檔案來所以雙引號裡面" "有值, 中括號


就還回true囉。如果沒有雙引號, 如果只有一個字串則會當成字串永遠為true,所以
    $ [ 1 ]
    $ echo $?
    0
    $ [ 0 ]
    $ echo $?
    0
如果有兩個以上,則shell把find丟出來的字串又當成命令,想去執行他,就發生 錯誤了。

Cyril Huang 2002-06-14