bash - 使用换行符将文件内容放入 unix 变量中

标签 bash unix

我有一个包含以下内容的文本文件 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 3a b c d变体展示了它的实际效果。

然后我们尝试使用 x 上的两个变体多变的。没有引号的 表示有四个词,"test" , "1" , "test""2" .添加引号使其成为一个 单个单词 "test 1\ntest 2" .

关于bash - 使用换行符将文件内容放入 unix 变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789319/

相关文章:

file - Unix 命令行 : How to get the total size of modified files in the last 30 days

linux - 逻辑地址(虚拟地址空间)而不是物理地址空间的原因

string - 在 Bash 中用另一个字符替换一个字符

linux - Grep 从 CSV 文件中获取特定列的最新值

linux - 使用固定种子打乱 find 的输出

linux - 如何将线程数设置为 PBS 作业队列中的下游变量

string - bash 脚本 : How to append characters at the end of a string efficiently (O(1))

C++ 链接无法在从 Unix 到 Linux 的项目迁移中找到库

unix - 如何在UNIX ssh中将同一目录中的所有文件(一个文件除外)移动到该文件中

linux - linux 命令末尾的 "&"是什么意思?