使用tr命令去除命令行参数换行符无效问题排查
为什么你的Shell脚本里换行符总是去不掉?
嘿,我来帮你捋清楚这个换行符的问题!核心原因其实是**echo命令默认会在输出末尾偷偷加一个换行符**,不管你的输入有没有换行,它都要补一个,这就导致你以为tr -d "\n"没生效,其实是echo又给加回来了。
咱们一步步拆解你的代码:
- 当你执行
sh test.sh someword时,$param的值就是纯纯的someword,本身没有任何换行符。 - 执行
trimmed_param=$(echo $param | tr -d "\n")时:echo $param会输出someword,然后自动追加一个换行符(\n)。tr -d "\n"确实把这个追加的换行符去掉了,所以trimmed_param里其实是没有换行的,就是someword。
- 但你用
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
相关产品推荐
相关产品推荐

