標籤:
十年營運系列之基礎篇 - Linux
曾林
聯絡:[email protected]
網站:www.jplatformx.com
著作權:文章未經同意請勿轉載
一、引言
本章節將繼續講解流量控制的內容。在上面講解if控制流程分支中,我們構建了一個簡單的菜單,並建立了用於響應使用者選擇的邏輯。為達到這個目的,我們使用了一系列的if命令來確定哪個是選中項。這種類型的程式構造經常會被使用到,所以許多程式設計語言(包括shell)為基於多項選擇的判斷提供了流量控制機制。
二、case命令
bash的多項選擇複合命令被稱為case,其文法如下所示:
case word in pattern [| pattern ]...) commands ;;esac
回顧以下的指令碼程式,可以看到用於響應使用者選擇的邏輯如下所示:
1 #!/bin/bash 2 3 # foo.sh : a menu driven system information program 4 5 clear 6 echo " 7 Please Select: 8 9 1. Display System information10 2. Display Disk Space11 3. Display Home Space Utilization12 0. Quit13 "14 15 read -p "Enter selection [0 ~ 3] > "16 17 if [[ $REPLY =~ ^[0-3]$ ]]; then 18 if [[ $REPLAY == 0 ]]; then19 echo "Program terminated."20 exit21 fi 22 23 if [[ $REPLY == 1 ]]; then24 echo "Hostname: $HOSTNAME"25 uptime26 exit27 fi 28 29 if [[ $REPLY == 2 ]]; then30 df -h31 exit32 fi 33 34 if [[ $REPLY == 3 ]]; then35 if [[ $(id -u) == 0 ]]; then36 echo "Home Space Utilization(All Users): "37 du -sh /home/*38 else39 echo "Home Space Utilization:"40 du -sh /$HOME41 fi 42 exit43 fi 44 else45 echo "Invalid entry." >&246 exit 147 fi
在這裡,如果使用case語句則可以簡化以上的邏輯。具體如下代碼:
1 #!/bin/bash 2 3 # foo-case.sh: a menu driven system information program 4 5 clear 6 echo " 7 8 Please Select: 9 1. Display System Information10 2. Display Disk Space11 3. Display Home Space Utilization12 0. Quit13 "14 15 read -p "Enter selection [0~3]> "16 17 case $REPLY in18 0) 19 echo "Program terminated."20 exit 21 ;; 22 1) echo "Hostname: $HOSTNAME"23 uptime24 ;; 25 2) df -h26 ;; 27 3) if [[ $(id -u) == 0 ]]; then28 echo "Home Space Utilization(All Users)"29 du -sh /home/*30 else31 echo "Home Space Utilizaiton"32 du -sh /$HOME33 fi 34 ;; 35 *) 36 echo "Invalid entry" >&237 exit 138 ;; 39 esac
case命令將關鍵字的值——本例中,即$REPLY的值——與特定的模式相比較,若發現吻合的模式後,將不再對比剩餘的模式。
1. 模式
同路徑名展開一樣,case使用以“)”字元結尾的模式。下表展示了一些有效模式。
| 模式 |
描述 |
| a) |
若關鍵字為a則吻合 |
| [[:alpha:]]) |
若關鍵字為單個字母則吻合 |
| ???) |
若關鍵字為三個字元則吻合 |
| *.txt) |
若關鍵字以.txt結尾則吻合 |
| *) |
與任何關鍵字吻合。在case命令的最後的一個模式應用此項是個不錯的做法,可對應所有前模式不吻合的關鍵字,也就是對應任何可能的無效值 |
下面是一個使用模式的範例。
(030) Linux之流量控制case分支