本文也即《Learning the bash Shell》3rd Edition的第五章Flow Control之讀書筆記之三,但我們將不限於此。flow control是任何程式設計語言中很常用的部分,也包括了case。在這裡,我們將繼續學習他們。
case通過檢測字串的樣式是否匹配,數目是否相等,進行相應不同的處理。將if-then-else的結構修改為更好的閱讀方式,格式如下:
case expression
in
pattern1 )
statements
;;
pattern2 )
statements
;;
...
esac
看看最後標明的結束的esac,以及if/else中的fi,都是反過來寫,這可能是bash的一個特色。注意statement後面是兩個分號。任何一個樣式都可以包含多個樣式,他們之間用“|”來分割,如果匹配其中的一個,就執行statement。case將將按順序依次進行檢查,直至匹配。下面是一個例子,對不同尾碼結尾的圖片檔案做不同的處理。我們不要具體如何處理,主要看看case的使用方式。
for filename in "$@"; do
case
$filename in
*.jpg )
exit 0 ;;
*.tga )
<do statement>;;
*.xpm )
<do statement>
;;
*.pcx )
<do statement>
;;
*.tif )
<do statement>
;;
*.gif )
<do statement>
;;
* )
echo "procfile: $filename is an unknown graphics file."
exit 1 ;;
esac
done
在其他進階變成語言中,例如C語言,常用switch的方式,他們都有一個default的選項,表示如果上面均不匹配時的處理方法,在bash中可以在最後*)進行同樣的處理。下面來閱讀另外一個例子。
cd( )
{
# 檢查寫但參數的數目,分別對0或1個參數,2個參數,其他進行處理
case
"$#" in
# 如果有1個或者0個參數,採用原有cd的處理方式,注意|的使用,表示這兩種情況之一匹配即可。
0 | 1)
builtin cd $1 ;;
# 對於2個參數,將當前路徑所有匹配參數1樣式的字串更換為樣式2,並跳到新的路徑中
2 )
newdir=${PWD//$1/$2}
# 這裡給了一個case嵌套的例子。如果更換的路徑和原來一樣,即沒有變化的處理,以及其他(即有更改)的處理。
case "$newdir" in
$PWD) echo "bash: cd: bad substitution" >&2 ;
return 1 ;;
* ) builtin cd "$newdir" ;;
esac ;;
# 對參數多與2個處理。
* ) echo "bash: cd: wrong arg count" 1>&2 ; return 1 ;;
esac
}
相關連結:
我的Linux操作相關文章