You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:42:51