将文件内容用换行符写入unixvariables

我有一个文本文件test.txt与以下内容:

text1 text2 

我想将文件的内容分配给一个UNIXvariables,但是当我这样做:

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

结果是:

 text1 text2 

代替

 text1 text2 

有人可以build议我一个这样的解决scheme吗?

这个赋值不会删除换行符,它实际上是这样做的echo 。 你只需要在string周围加引号来维护这些换行符:

 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 

换行符被空格replace的原因并不完全在于echo命令,而是它们的组合。

当给出一个命令行时,根据IFSvariables的文档, bash将其分成几个字:

IFS:扩展后用于分词的内部字段分隔符…默认值是<space><tab><newline>

这就是说,默认情况下,这三个字符中的任何一个都可以用来将你的命令分成单独的单词。 在那之后,单词分隔符不见了,你剩下的只是一个单词列表。

将它与echo文档(一个bash内部命令)结合起来,你就会明白为什么输出空格:

echo [-neE] [arg …]:输出参数,用空格分隔,后跟一个换行符。

当你使用echo "$x" ,它会根据bash强制整个xvariables成为一个单词,因此它不会被分割。 你可以看到:

 pax> function count { ...> echo $# ...> } pax> count 1 2 3 3 pax> count abcd 4 pax> count $x 4 pax> count "$x" 1 

在这里, count函数只是输出给定的参数数量。 1 2 3abcd变体显示它在行动。

然后我们用xvariables的两个变体来尝试它。 没有引号的那个表示有"test""1""test""2"四个单词。 添加引号使其成为一个单词"test 1\ntest 2"

Bash -ge 4具有内置的mapfile,可以将标准input中的行读取到数组variables中。

 help mapfile mapfile < file.txt lines printf "%s" "${lines[@]}" mapfile -t < file.txt lines # strip trailing newlines printf "%s\n" "${lines[@]}" 

也可以看看:

http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile

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

 $ 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 

只要有人对另一个select感兴趣:

 content=( $(cat test.txt) ) a=0 while [ $a -le ${#content[@]} ] do echo ${content[$a]} a=$[a+1] done 

您的variables通过testvar=$(cat test.txt)正确设置。 要显示这个由新行字符组成的variables,只需添加双引号,例如

 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 

envdir实用程序提供了一个简单的方法来执行此操作。 envdir使用文件来表示环境variables,文件名称映射到env var名称,文件内容映射到env var值。 如果文件内容包含换行符,env var也是如此。

请参阅https://pypi.python.org/pypi/envdir