腳本代碼
function maybe_prompt_user() {
if $ASSUME_YES; then
return 0
else
read -p "$1"
if [[ $REPLY =~ ^[Yy]$ ]]; then
return 0
else
return 1
fi
fi
}
逐行解析
if $ASSUME_YES; then:若環境變量 ASSUME_YES 為真命令(如 true 或非空字符串),直接返回 0(成功),跳過交互。常用於自動化腳本 ASSUME_YES=true ./script.sh。
read -p "$1":提示用戶輸入,提示文本為函數第一個參數($1),結果存入內建變量 REPLY。
[[ $REPLY =~ ^[Yy]$ ]]:Bash 正則匹配。
— =~ 表示右側為正則表達式。
— ^ 匹配行首,$ 匹配行尾。
— [Yy] 匹配大小寫 Y。
— 整體含義:用戶輸入僅為單個字符 Y 或 y(不允許 yes/YES/空格)。
- 返回 0 表示繼續,1 表示中止。
調用示例
maybe_prompt_user "是否繼續安裝?(Y/y): "
if [ $? -eq 0 ]; then
echo "繼續..."
else
echo "用戶取消"
exit 1
fi
常見誤區修正
^ 在字符類 [] 內(如 [^Yy])表示「非」,但在 ^ 位於模式開頭時表示「行首錨點」。本腳本中 ^[Yy]$ 正確表達「整行只能是 Y/y」。
ASSUME_YES 若未設置,if $ASSUME_YES 會報錯「command not found」。建議改為:
if [ -n "$ASSUME_YES" ]; then 或 if ${ASSUME_YES:-false}; then。