iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

30 天不間斷-資工隨筆大雜燴系列 第 23

[Day 23] 自己的 Shell Script 自己寫 - 判斷式(2)

前言

昨天我們介紹了 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 完成這個腳本,功能是一樣的,但是後者的效率會比較優。

if-else 版本

  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 

switch-case 版本

  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    

輸入

  • ${0}: 程式名稱
  • ${1}: 動物名稱(cat|dog|fish|frog)

處理

之後字串${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/


上一篇
[Day 22] 自己的 Shell Script 自己寫 - 判斷式(1)
下一篇
[Day 24] 自己的 Shell Script 自己寫 - for 迴圈
系列文
30 天不間斷-資工隨筆大雜燴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言