Bash脚本问题:输入值匹配数组时终止循环而非退出程序
解决方法
你的问题核心在于:
exit 0会直接终止整个脚本,导致后续的echo SUCCESS无法执行- 单独使用
break仅会跳出内层的for循环,外层while true会继续运行,无法终止输入检查
下面提供三种可行的解决方案:
方案一:使用标志变量
通过一个状态变量标记是否找到匹配值,以此控制外层while循环的终止:
var=( one two three ) found=0 while [ $found -eq 0 ]; do read -p "Choose value: " val for i in "${var[@]}";do if [ "$i" = "$val" ]; then found=1 break # 跳出内层for循环 fi done done echo SUCCESS
方案二:使用break 2跳出多层循环
Bash中支持break N语法,其中N表示要跳出的循环层数。这里用break 2直接跳出内层for循环和外层while循环:
var=( one two three ) while true; do read -p "Choose value: " val for i in "${var[@]}";do if [ "$i" = "$val" ]; then break 2 # 同时跳出for和while两层循环 fi done done echo SUCCESS
方案三:用grep简化匹配逻辑
无需嵌套循环,直接通过printf输出数组元素并结合grep精确匹配输入值,代码更简洁:
var=( one two three ) while true; do read -p "Choose value: " val # -q 静默模式不输出结果,-x 精确匹配避免部分匹配 if printf "%s\n" "${var[@]}" | grep -qx "$val"; then break fi done echo SUCCESS
内容的提问来源于stack exchange,提问作者teerrrzi
相关产品推荐
相关产品推荐

