標籤:

20.5 Shell 條件表達式 (從新手到菜鳥的Linux教程)

原文鏈接


除了 js 和 c/cpp 的三目操作符 [] ? [] : [] 和 python 的 [val1] if [cond] else [val2] <del>是的我就是要吐槽它們順序不一樣</del> ,應該大部分語言的條件表達式只有 if-else 類或者 switch-case 類,那麼我們也從這兩種看一下 bash 里怎麼做條件判斷。

if-else

基本語法是

if [ cond1 ]nthenn exp1nelif [ cond2 ]n exp2nelsen exp3nfin

假設大家都已經掌握了 if-else 結構,這裡只強調幾個不按常理出牌的地方:

  • 左右方括弧周圍要有空格,不然就是語法錯誤(原因接下來說道 `test` 的時候會分析),比如:

$ if [ 1 -ne 2 ]; then echo "Surely"; else echo "Math taught by literature teacher."; finSurelyn$ if [1 -ne 2 ]; then echo "Surely"; else echo "Math taught by literature teacher."; finbash: [1: command not foundnMath taught by literature teacher.n$ if [ 1 -ne 2]; then echo "Surely"; else echo "Math taught by literature teacher."; finbash: [: missing `]nMath taught by literature teacher.n

這裡我們也展示了如何將 if-else 寫在同一行內。

  • 和 matlab 不一樣的地方是, if-else 塊用 fi 結束,而不是 end (相比之下我覺得還是 matlab 的寫法好一點)。
  • 測試條件是返回值等於 0 為真,返回值非零為假(真 TM 奇怪,居然和 VB 差不多 -> Why is True equal to -1)

[ 與 test

上面提到了左右方括弧兩邊必須加空格,這是為什麼呢?

$ help [n[: [ arg... ]nEvaluate conditional expression.nnThis is a synonym for the "test" builtin, but the last argument mustnbe a literal `], to match the opening `[.n

這就很有趣了,我們再來看看 test 的幫助:

$ help testntest: test [expr]nEvaluate conditional expression.nnExits with a status of 0 (true) or 1 (false) depending onnthe evaluation of EXPR. Expressions may be unary or binary. Unarynexpressions are often used to examine the status of a file. Therenare string operators and numeric comparison operators as well.nnThe behavior of test depends on the number of arguments. Read thenbash manual page for the complete specification.n

因此 [ 只是 test 的別名,只是最後一個參數必須是 ] ;至於 test 能幹嘛,只要知道它測試文件狀態、比較字元串或數字就可以了——剩下的,文檔都說了 Read the bash manual page for the complete specification <del>面向 StackOverFlow 編程就可以了</del>。

if-else 的簡化寫法

我們注意到既然條件表達式可以包含命令,那麼我們就可以直接把分支中的表達式「接」在做出判斷後面;這種技巧是這樣實現的:

condition && if_succeed || if_failedn

<del>這種語句為什麼能夠成立留作習題</del>

case-esac 結構

是的,他們又把單詞反過來了(手動微笑),舉個例子:

$ day="Sat"n$ case $day inn> Mon | Tue | Wed | Thu | Fri)n> echo Oh no, we have to work today.n> ;;n> Sat | Sun)n> echo Relax!n> ;;n> *)n> echo Sorry aliens.n> ;;n> esacnRelax!n

別忘了打兩個分號。

推薦閱讀:

如何評價 Windows 版「bash」(及其相關 *nix 子系統)?
linux刪除根目錄後發生了什麼?
20.4 Shell 字元串 (從新手到菜鳥的Linux教程)
有哪些 Bash 的替代語言?

TAG:Bash |