Bash脚本while循环不满足-ge条件仍无法终止问题咨询
问题原因
脚本死循环的核心问题是while循环的语法结构写错了。
Bash 对while循环的语法要求很明确:while关键字后到do关键字之前的所有内容,都会被当做循环是否继续的判断命令序列;do和done之间的内容才是每次循环要执行的循环体。
你写的代码把echo $max放在了判断段里:
while [ $max -ge 0 ] echo $max # 错放在了判断段,不在循环体内 do max=`expr $max - 1` done
这种写法下,每次循环前Bash会依次执行判断段里的两条命令:先跑[ $max -ge 0 ]做大小比较,再跑echo $max打印值,最后只取最后一条命令(也就是echo)的退出状态作为循环是否继续的判断标准。echo命令只要能正常输出,退出状态永远是0(Bash里代表逻辑真),所以不管max减到多少,判断结果永远为真,循环自然停不下来。
修复方法
把echo $max挪到do之后的循环体里就行,修正后的代码:
#!/bin/bash function looptest() { max=5 while [ $max -ge 0 ] do echo $max max=`expr $max - 1` done } looptest
修正后运行脚本会依次打印5、4、3、2、1、0,之后max减为-1,不满足大于等于0的判断条件,循环就会正常终止。
额外优化提示:日常写Bash脚本做算术运算不用额外调用expr,用内置算术写法((max--))替换max=expr $max - 1``即可,执行效率更高,写法也更简洁。
内容的提问来源于stack exchange,提问作者Amit Rout
相关产品推荐
相关产品推荐

