如何在Bash的read命令中去除用户输入的所有空白字符
解决Bash脚本中管道导致的子shell变量问题
错误原因
你遇到的问题核心是管道(|)会创建独立子shell,read命令在子shell中执行时,变量good的赋值仅在该子shell内生效,父shell无法获取到修改后的值,因此后续if判断会因变量未正确赋值报错。
解决方法
无需通过管道处理输入,直接在父shell中完成变量的空白字符去除,推荐两种实用方案:
方案一:Bash内置参数扩展(高效无外部命令)
利用Bash原生的参数扩展语法,直接替换变量中的所有空白字符(空格、制表符等),无需启动外部进程:
#!/bin/bash x=1 while [ $x -le 1 ] do read -r -p "Are you good? (y/n): " good # 去除变量内所有空白字符 good=${good//[[:blank:]]/} if [ "${good,,}" == "y" ]; then echo "Nice!" ((x++)) break elif [ "${good,,}" == "n" ]; then echo "That's ok" ((x++)) else echo "Only answer with y or n (ctrl+c to exit)" fi done
方案二:命令替换(兼容多Shell)
如果需要兼容非Bash的Shell,可以用tr配合命令替换处理变量,同样在父shell内完成操作:
#!/bin/bash x=1 while [ $x -le 1 ] do read -r -p "Are you good? (y/n): " input # 通过tr去除空白字符后赋值给good good=$(echo "$input" | tr -d '[:blank:]') if [ "${good,,}" == "y" ]; then echo "Nice!" ((x++)) break elif [ "${good,,}" == "n" ]; then echo "That's ok" ((x++)) else echo "Only answer with y or n (ctrl+c to exit)" fi done
关键说明
- 原脚本中
read ... | tr ...的写法,会让read在子shell中执行,导致good变量仅存在于子shell,父shell无法访问,因此出现变量修改丢失的错误。 - 两种方案都是先将用户输入读取到父shell的变量中,再在父shell内处理空白字符,彻底避免了子shell的问题。
内容的提问来源于stack exchange,提问作者iLandingin.tech
相关产品推荐
相关产品推荐

