昨天我們介紹了 if...elif...else,但假設今天要寫一個選單功能的程式,例如我們下面用 if else 實作輸入對應的動物名稱輸出對應的叫聲,這時變數內容只是要判斷輸入內容是否等於選單名稱,使用 if else 判斷的話會比較慢,因此今天要介紹 switch case 來解決這個問題
case $變數名稱 in
"變數1") 如果變數內容是變數1,就執行`;;`之前的所有內容,然後跳出判斷式,如果不是變數1,則往下一個 case “變數2" 執行
;;
"變數2") 當變數內容是變數1,就執行`;;`之前的所有內容,然後跳出判斷式,如果不是變數2,則往下一個 case * 執行
;;
*) 當執行到 *,代表變數內容是任意字元都會執行此區段,通常拿來當做最後一個 case 使用
;;
esac
我們可以發現當進入每一個 case 的時候,開頭都會有一個 "")
,這樣的寫法會讓程式在決定是否要進入的時候只要判斷這個字串就好了,會比 if-else 的 (if [ "$變數名稱" = "變數1" ] 要來得快一點。
下面要來寫前言說明的程式內容,而我們一開始先用 if-else 來實作,接下來再用 switch-case 完成這個腳本,功能是一樣的,但是後者的效率會比較優。
1 #!/bin/bash
2
3 if [ "${1}" = "cat" ]
4 then
5 echo "Meow"
6 elif [ "${1}" = "dog" ]
7 then
8 echo "Wang"
9 elif [ "${1}" = "fish" ]
10 then
11 echo "Fachai"
12 elif [ "${1}" = "frog" ]
13 then
14 echo "Gua"
15 else
16 echo "Usage ${0} {cat|dog|fish|frog}"
17 fi
18
1 #!/bin/bash
2
3
4
5 case ${1} in
6 "cat")
7 echo "Meow"
8 ;;
9 "dog")
10 echo "Wang"
11 ;;
12 "fish")
13 echo "Fachai"
14 ;;
15 "frog")
16 echo "Gua"
17 ;;
18 *)
19 echo "Usage ${0} {cat|dog|fish|frog}"
20 ;;
21 esac
之後字串${1}會導入對應的 case ,如果是 dog ,那就會分流到以下這一段 code:
9 "dog")
10 echo "Wang"
11 ;;
如果是什麼都沒有輸入,最後會導入 *) 下面這一段 code 並輸出 Usage ${0} {cat|dog|fish|frog}
18 *)
19 echo "Usage ${0} {cat|dog|fish|frog}"
20 ;;
$ animal.sh frog
Gua
$ animal.sh
Usage ./animal.sh {cat|dog|fish|frog}
https://www.geeksforgeeks.org/switch-vs-else/
https://linuxize.com/post/bash-case-statement/