Linux-Linux:通过子shell的方式保留空格和换行符
书上这样介绍到
假设我们使用子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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
先用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,不会被分词。