先用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-->
echo123
--根据IFS分词-->
echo123
所以用1、2、3作为参数调用echo。
这时候只要加上双引号阻止分词就可以了:
echo"$out"
--展开out-->
echo"123"
--根据IFS分词,双引号里不分词-->
echo"123"
123 被当作参数传给echo,然后就是你想要的结果了。
也可以把IFS设成其他字符,例如IFS=,,然后echo $out和echo "$out"的结果是一样的,因为输入里没有IFS,不会被分词。