Shell脚本中如何在循环内设置父变量以退出循环?
解决Shell猜数字游戏的循环退出与变量问题
先给你修正后的完整可运行代码:
Guessing_Game() { echo "Guessing Game!" # 正确的变量赋值方式:无空格,无需set命令 loopSwitch=0 # until循环的标准语法结构 until [[ $loopSwitch == 1 ]]; do echo "当前loopSwitch值: $loopSwitch" read -p "Guess a number between 1 and 10: " userGuess if [[ $userGuess == 6 ]]; then echo "Well done! You win." else echo "Incorrect guess." fi read -p "Would you like to play again? (y/n) " playAgain # 兼容大小写的退出判断,正确赋值变量 if [[ $playAgain == "n" || $playAgain == "N" ]]; then loopSwitch=1 fi done }
下面逐一拆解你代码里的问题:
1. 变量赋值的核心错误
Shell中变量赋值的规则是赋值符号=两边不能有空格,而且完全不需要set命令。你尝试的几种写法全是错误的:
set loopSwitch = 1:这是把loopSwitch、=、1当成set命令的参数,根本不是给变量赋值loopSwitch = 1:=两边的空格会让Shell把loopSwitch当成命令,=和1当成参数,直接报错- 正确写法:
loopSwitch=1
这就是你echo $loopSwitch没有输出的原因——变量从一开始就没被正确初始化,始终是空值。
2. until循环的语法错误
until循环的标准结构是:
until [ 条件判断 ]; do # 循环体代码 done
你把do的位置放错了,还在until条件行之后加了echo $loopSwitch,导致Shell无法正确解析循环结构,逻辑完全混乱。修正后要把do紧跟在条件判断的]];后面(可以换行,但分号不能少)。
3. 变量作用域的误解
你担心的子shell问题在这里根本不存在——只有当代码被包裹在()中,或者通过管道|执行时才会产生子shell。这个函数和循环都运行在当前Shell环境下,变量loopSwitch在整个函数内都是可见的,只要正确赋值,循环就能读取到它的变化并退出。
额外优化点
- 给
playAgain的输入提示加个空格,用户输入时体验更好 - 判断退出时兼容大写
N,避免用户输错大小写导致无法退出
内容的提问来源于stack exchange,提问作者MeltedMetal
相关产品推荐
相关产品推荐

