我有一个包含以下内容的文本文件 test.txt:
text1
text2
我想将文件的内容分配给一个 UNIX 变量,但是当我这样做时:
testvar=$(cat test.txt)
echo $testvar
结果是:
text1 text2
代替
text1
text2
有人可以建议我解决这个问题吗?
最佳答案
分配不删除换行符,它实际上是echo
这样做。您只需在字符串周围加上引号即可维护这些换行符:
echo "$testvar"
这将给出您想要的结果。请参阅以下演示文稿:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
用空格替换换行符的原因并不完全与echo
有关命令,而是事物的组合。
当给出命令行时,bash
根据 IFS
的文档将其拆分为单词变量:
IFS: The Internal Field Separator that is used for word splitting after expansion ... the default value is
<space><tab><newline>
.
这指定,默认情况下,这三个字符中的任何一个都可用于将您的命令拆分为单个单词。之后,单词分隔符消失了,剩下的就是单词列表。
将其与 echo
结合起来文档(bash
内部命令),你会看到为什么输出空格:
echo [-neE] [arg ...]: Output the args, separated by spaces, followed by a newline.
当您使用 echo "$x"
时, 它强制整个 x
根据 bash
变量为单个 单词,因此它没有 split 。你可以看到:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
在这里,count
函数只是打印出给定参数的数量。 1 2 3
和 a b c d
变体展示了它的实际效果。
然后我们尝试使用 x
上的两个变体多变的。没有引号的 表示有四个词,"test"
, "1"
, "test"
和 "2"
.添加引号使其成为一个 单个单词 "test 1\ntest 2"
.
关于bash - 使用换行符将文件内容放入 unix 变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789319/