如何实现shell程序在用户输入非y/Y值时自动退出循环
问题原因
你当前的代码核心问题出在循环判断条件的写法错误,同时有2个容易引发隐患的写法问题:
- 原循环条件
[ $continue = "y" -o "Y" ]的实际逻辑是「$continue等于y,或者字符串"Y"非空」,而固定字符串"Y"永远为真,所以无论你输入什么内容,循环都会一直执行,无法退出 continue是shell的内置关键字(用于跳过当前循环的剩余语句直接进入下一轮循环),用作自定义变量名可能触发不可预期的错误- 变量引用没有加双引号,当用户输入为空时会触发语法报错
修正后的完整代码
#! /bin/sh # 初始化循环标记为y run_flag="y" # 修正后的循环条件:只有当run_flag是y或者Y时才继续循环 while [ "$run_flag" = "y" -o "$run_flag" = "Y" ] do echo "Please enter a station name to start search" read name result=`grep -w "^$name" STATIONS.TXT` if [ -z "$result" ]; then echo "$name was not found in the file" else echo "$name was found in STATIONS.TXT" fi echo "Do you want to have another go? (enter y or Y to confirm, other to quit)" read input run_flag=$input done echo "End of the search program."
可选优化
如果后续需要扩展更多大小写兼容的判断,可以把循环条件改成更简洁的写法,直接把输入转成小写再判断:
while [ "$(echo "$run_flag" | tr '[:upper:]' '[:lower:]')" = "y" ]
内容的提问来源于stack exchange,提问作者Ye Yint Hlyan
相关产品推荐
相关产品推荐

