Linux-Linux:通过子shell的方式保留空格和换行符

发布于 2016-11-10 11:18:45 字数 261 浏览 1824 评论 1

书上这样介绍到

假设我们使用子shell或反引号的方法将命令的输出读入一个变量中,可以将它放入双引号中,以保留空格和换行符(n),例如文件test中的内容如下

cat test
1
2
3

out=$(cat test)
echo $out
1 2 3 #丢失了换行符

out="$(cat test)"
echo $out
1 #没有丢失换行符
2
3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

晚风撩人 2017-01-19 01:28:08

先用set | grep out 你会看到两个out是这样保存的:

out=$'1n2n3'

$'...'表示里面反斜杠开头是转义字符,这种字符串也叫ANSI C like strings,和下面这个是有区别的:

another='1n2n3'

echo $'1n2n3' 就能得到你想要的结果。

也就是说,变量里实际是有换行符的,只是传给echo的时候做了些变换。

bash把变量展开之后,会根据IFS(Internal Field Separator)把输入划分成多个单独的单词(Word splitting),除了在双引号里,原输入里的IFS都换成空格,连续空格再缩成1个空格。默认的IFS里有空格、换行和Tab。

所以输入echo $out,bash处理是这样的:

 echo<空格>$out
--展开out-->
echo<空格>1<换行>2<换行>3
--根据IFS分词-->
echo<空格>1<空格>2<空格>3

所以用1、2、3作为参数调用echo。

这时候只要加上双引号阻止分词就可以了:

 echo<空格>"$out"
--展开out-->
echo<空格>"1<换行>2<换行>3"
--根据IFS分词,双引号里不分词-->
echo<空格>"1<换行>2<换行>3"

1<换行>2<换行>3 被当作参数传给echo,然后就是你想要的结果了。

也可以把IFS设成其他字符,例如IFS=,,然后echo $out和echo "$out"的结果是一样的,因为输入里没有IFS,不会被分词。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文