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

使用tr命令去除命令行参数换行符无效问题排查

为什么你的Shell脚本里换行符总是去不掉?

嘿,我来帮你捋清楚这个换行符的问题!核心原因其实是**echo命令默认会在输出末尾偷偷加一个换行符**,不管你的输入有没有换行,它都要补一个,这就导致你以为tr -d "\n"没生效,其实是echo又给加回来了。

咱们一步步拆解你的代码:

  1. 当你执行sh test.sh someword时,$param的值就是纯纯的someword,本身没有任何换行符。
  2. 执行trimmed_param=$(echo $param | tr -d "\n")时:
    • echo $param会输出someword,然后自动追加一个换行符(\n)。
    • tr -d "\n"确实把这个追加的换行符去掉了,所以trimmed_param里其实是没有换行的,就是someword。
  3. 但你用echo $trimmed_param| od -xc验证时,这个echo又给someword加了一个换行符,所以od才会显示末尾的000a(换行的十六进制表示)。

那怎么解决呢?给你几个靠谱的方案:

方案1:用printf替代echo(最推荐,跨平台)

printf不会自动加换行,完全按你指定的格式输出。修改代码如下:

param=$1
# 用printf输出参数,无额外换行,再去除可能存在的换行
trimmed_param=$(printf "%s" "$param" | tr -d "\n")
# 验证时也用printf,避免额外加换行
printf "%s" "$trimmed_param" | od -xc

方案2:用参数展开直接替换换行(更高效)

如果你的参数里的换行是来自输入(比如带引号传递的多行内容),可以直接用Shell的参数展开功能,不需要调用外部命令:

param=$1
# 直接替换掉参数里所有的换行符
trimmed_param=${param//$'\n'/}
# 验证
printf "%s" "$trimmed_param" | od -xc

方案3:给echo加-n参数

如果你非要用echo,记得加上-n来禁止自动添加换行:

param=$1
trimmed_param=$(echo -n "$param" | tr -d "\n")
printf "%s" "$trimmed_param" | od -xc

不过要注意,echo -n在极少数老版本Shell里可能有兼容性问题,还是printf更稳妥。

现在再执行修改后的脚本,od的输出里就不会有末尾的000a啦!

内容的提问来源于stack exchange,提问作者RJ Cole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:34:59