CASE 陳述式

Bash 指令稿入門

Alex Scriven

Data Scientist

為何需要 CASE 陳述式

當條件很多或複雜時,Case 陳述式通常比 IF 更合適。

假設你要測試以下條件與動作:

  • 如果檔案包含 sydney,就把它移到 /sydney 目錄
  • 如果檔案包含 melbournebrisbane,就刪除它
  • 如果檔案包含 canberra,就把它重新命名為 IMPORTANT_filename,其中 filename 是原始檔名
Bash 指令稿入門

複雜的 IF 陳述式

你可以像這樣堆疊多個 IF:

  • 這段程式用 grep 對第一個 ARGV 參數進行條件判斷。
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • 看起來又複雜又重複,對吧?
Bash 指令稿入門

建立 CASE 陳述式

  • 先選擇要比對的變數或字串
    • 你也可以在這裡呼叫巢中殼層!
  • 視需要加入多組比對與對應動作。
    • PATTERN 可用正規表示式。例如 Air* 表「以 Air 開頭」,*hat* 表「包含 hat」。
  • 記得以右括號分隔樣式與要執行的程式碼,並以連續兩個分號結束每個指令

基本 CASE 陳述式格式:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Bash 指令稿入門

建立 CASE 陳述式

 

  • *) DEFAULT COMMAND;;

    • 常見做法(非必須)是在最後加入預設指令,當前面樣式都不符合時執行。
  • esac 最後以關鍵字「esac」結尾

    • 這是把「case」倒過來寫!

基本 CASE 陳述式格式:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Bash 指令稿入門

從 IF 到 CASE

我們先前的 IF:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

我們新的 CASE:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Bash 指令稿入門

一起來練習吧!

Bash 指令稿入門

Preparing Video For Download...