參考說明:
https://www.runoob.com/linux/linux-shell-process-control.html
Shell case語句為多選擇語句。可以用case語句比對一個值與一個模式,如果比對成功,執行相比對的指令。case語句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示。取值後面必須為單詞in,每一模式必須以右括号結束。取值可以為變量或常數。比對發現取值符合某一模式後,其間所有指令開始執行直至;; 。
取值将檢測比對的每一個模式。一旦模式比對,則執行完比對模式相應指令後不再繼續其他模式。如果無一比對模式,使用星号 * 捕獲該值,再執行後面的指令。
下面的腳本提示輸入1到4,與每一種模式進行比對:
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字為:'
read aNum
case $aNum in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒有輸入 1 到 4 之間的數字'
;;
esac
跳出循環
在循環過程中,有時候需要在未達到循環結束條件時強制跳出循環,Shell使用兩個指令來實作該功能:break和continue。
break指令
break指令允許跳出所有循環(終止執行後面的所有循環)。
下面的例子中,腳本進入死循環直至使用者輸入數字大于5。要跳出這個循環,傳回到shell提示符下,需要使用break指令。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束"
break
;;
esac
done
continue
continue指令與break指令類似,隻有一點差别,它不會跳出所有循環,僅僅跳出目前循環。
對上面的例子進行修改:
運作代碼發現,當輸入大于5的數字時,該例中的循環不會結束,語句 echo "遊戲結束" 永遠不會被執行。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的!"
continue
echo "遊戲結束"
;;
esac
done
esac
case的文法和C family語言差别很大,它需要一個esac(就是case反過來)作為結束标記,每個case分支用右圓括号,用兩個分号表示break。