用换行符将内容归档到Unix变量中


117

我有一个文本文件test.txt,内容如下:

text1
text2 

我想将文件的内容分配给UNIX变量,但是当我这样做时:

testvar=$(cat test.txt)
echo $testvar

结果是:

text1 text2

代替

text1
text2 

有人可以建议我解决这个问题吗?

Answers:


184

这个分配删除换行字符,它实际上是在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:内部字段分隔符,用于扩展后的单词拆分...默认值为<space><tab><newline>

这指定默认情况下,可以使用这三个字符中的任何一个将命令拆分为单个单词。之后,单词分隔符消失了,剩下的就是单词列表。

结合echo文档(bash内部命令),您将看到为什么输出空格:

echo [-neE] [arg ...]:输出args,以空格分隔,后跟换行符。

使用时echo "$x",它将根据强制将整个x变量设为单个单词bash,因此不会拆分。您可以看到:

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"


引号...那就是我所缺少的!谢谢!
匿名者

同样值得注意的是:尾随换行符将由命令替换运算符本身删除:在线尝试!
约拿

11

这是由于包含换行符的IFS(内部字段分隔符)变量引起的。

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

一种解决方法是暂时将IFS重置为不包含换行符

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

为了消除IFS的这一可怕变化:

IFS=$IFSBAK

我已经进行了此更改,但是现在我的其他操作不起作用,请告诉我将其重置为零?
Pooja25年

如果您不需要它来访问变量,则直接使用echo "$(IFS=''; cat text.txt)"
单线


3

就算有人对另一种选择感兴趣:

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done

3

您的变量已通过正确设置testvar=$(cat test.txt)。要显示包含换行符的变量,只需添加双引号,例如

echo "$testvar" 

这是完整的示例:

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2

0

envdir实用程序提供了一种简便的方法。 envdir使用文件表示环境变量,文件名映射到环境变量名称,文件内容映射到环境变量值。如果文件内容包含换行符,那么env var也会包含换行符。

参见https://pypi.python.org/pypi/envdir

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.