Windows环境下Bash脚本while-do循环无法终止问题求助
解决Bash脚本while循环无法终止的问题
嘿,作为Bash新手碰到这种循环停不下来的问题确实闹心,我来帮你捋捋~
首先先把你贴的代码整理成可读性更好的格式:
function user_input { while true; do echo "1. choice 1" echo "2. choice 2" read -p "What choice would you like: [1,2] " ANS case $ANS in '1') environment="-A" break;; '2') environment="-B" break;; *) echo "Wrong input, try again";; esac done }
你说循环没法终止,试了read -a能终止但收不到输入,结合你在Windows机器上运行的情况,大概率是换行符的兼容问题:Windows系统的默认换行是CRLF(\r\n),而Bash(类Unix环境)默认只认LF(\n)。当你在Windows的Bash终端(比如Git Bash、WSL)输入内容时,输入的回车会被解析成\r,导致$ANS的实际值是1\r或2\r,而你的case里匹配的是纯1或2,自然永远走到*分支,循环停不下来。
至于read -a能终止循环,是因为它会把输入按空格拆分存到数组里,\r会被当成分隔符的一部分,导致最终没有匹配到有效分支的逻辑被跳过?不过这显然不是正确的解决方式。
给你两个靠谱的解决方案:
方案1:手动去除输入中的回车符
在case判断之前,把$ANS里的\r去掉就行,用Bash的参数替换就能轻松搞定:
function user_input { while true; do echo "1. choice 1" echo "2. choice 2" # 加-r参数避免反斜杠被转义,是写Bash脚本的好习惯 read -rp "What choice would you like: [1,2] " ANS # 去除变量末尾的Windows风格回车符 ANS=${ANS%$'\r'} case $ANS in '1') environment="-A" break;; '2') environment="-B" break;; *) echo "Wrong input, try again";; esac done }
方案2:让Bash全局忽略回车符
在脚本的最开头加上一行配置,让Bash自动忽略输入里的回车符,这样你原来的代码几乎不用改动就能正常工作:
export SHELLOPTS=igncr
另外不用额外安装任何库或包,这就是Windows和类Unix环境换行差异导致的小坑,调整一下输入处理逻辑就好啦~
内容的提问来源于stack exchange,提问作者Yousef
相关产品推荐
相关产品推荐

