Bash 迴圈流程控制、Case 條件分支與互動選單
1. 核心觀念:流程控制跳轉關鍵字
在任何迴圈結構(while、until、for)內部,控制流程的主要指令如下:
| 關鍵字 | 核心行為 | 典型應用場景 |
|---|---|---|
break | 跳出整層迴圈,立即執行迴圈 done 後續的下一行指令 | 使用者完成選單操作,或已找到目標檔案 |
continue | 略過本次迭代,不跑剩下的程式碼,直接回到迴圈開頭判斷下一次 | 輸入錯誤時提示並重新輸入,或略過暫存檔 |
exit | 直接終止整個 Script 行程,返回給父行程指定的退出狀態碼(預設 0) | 使用者主動選擇離開,或遭遇不可復原的致命錯誤 |
2. 修正版:標準 While + Case 互動選單架構
針對原筆記的選單範例,修正語法並加入清除畫面、提示字元與防呆機制的標準模板:
#!/usr/bin/env bash
while true; do
echo "=================================="
echo " HomeLab 維運管理選單"
echo "=================================="
echo " a) 查看 Docker 容器狀態"
echo " b) 重啟 Nextcloud 服務"
echo " c) 執行資料庫備份"
echo " q) 離開選單"
echo "=================================="
# -r 防止反斜線被轉義,-p 顯示提示文字
read -r -p "請輸入選項 [a-c, q]: " CHOICE
case "${CHOICE}" in
a|A)
echo "--> 正在列出運行中的容器..."
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
break # 執行完畢跳出選單
;;
b|B)
echo "--> 正在重啟 Nextcloud..."
docker compose -f /opt/nextcloud/docker-compose.yml restart
echo "重啟完成。"
continue # 重新回到選單開頭
;;
c|C)
echo "--> 執行備份任務..."
/opt/scripts/backup.sh
continue
;;
q|Q)
echo "離開程式。"
exit 0 # 正常結束腳本
;;
*)
echo "錯誤:無效的選項 [${CHOICE}],請重新輸入!" >&2
sleep 1
continue
;;
esac
done
echo "選單結束,繼續執行後續自動化作業..."
語法細節提醒:
case支援多值匹配:使用豎線|可同時捕獲大小寫(如a|A))。每個條件分支區塊必須以兩個分號
;;結尾,代表該分支處理結束。
*)代表通配符,能匹配前面皆未中選的所有其他字元,作為預設防呆分支(Default Fallback)。