Bash中用tr将逗号换为换行赋值变量时换行转空格的解决方法
如何让Bash变量保留换行符
这问题我之前也碰到过!核心原因是当你用echo $x的时候,Bash会把变量里的换行符当成空格来处理(这是因为默认的字段分隔符IFS包含空格、制表符和换行),而且命令替换本身其实是保留换行的,只是输出的时候被吃掉了。
下面给你几个可行的解决办法:
方法1:用双引号包裹变量输出
这是最简单的方式,只要在echo的时候把变量用双引号括起来,就能完整保留换行:
x=$(echo "a,b" | tr ',' '\n') echo "$x"
执行后输出就是:
a b
方法2:使用printf代替echo
printf对格式的处理更严谨,不需要额外加引号也能保留换行(当然加了也没问题):
x=$(echo "a,b" | tr ',' '\n') printf "%s" "$x"
如果需要在末尾额外追加一个换行,可以改成:
printf "%s\n" "$x"
根据自己的实际需求选择即可。
方法3:临时修改IFS(不推荐日常使用)
如果你非要用echo $x的形式输出,可以临时修改IFS,把换行从字段分隔符列表中移除,但这种方式容易影响其他命令的逻辑,用完记得恢复原来的IFS:
OLD_IFS=$IFS IFS=$'\n' x=$(echo "a,b" | tr ',' '\n') echo $x IFS=$OLD_IFS
另外补充个小技巧:你可以用declare -p x查看变量的实际内容,能直观看到换行符其实一直存在于变量中:
x=$(echo "a,b" | tr ',' '\n') declare -p x
输出会类似declare -- x="a\nb",证明换行符并没有丢失,只是echo $x的输出规则把它转成了空格。
内容的提问来源于stack exchange,提问作者wulujey
相关产品推荐
相关产品推荐

