将文件内容用换行符写入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
命令,而是它们的组合。
当给出一个命令行时,根据IFS
variables的文档, bash
将其分成几个字:
IFS:扩展后用于分词的内部字段分隔符…默认值是
<space><tab><newline>
。
这就是说,默认情况下,这三个字符中的任何一个都可以用来将你的命令分成单独的单词。 在那之后,单词分隔符不见了,你剩下的只是一个单词列表。
将它与echo
文档(一个bash
内部命令)结合起来,你就会明白为什么输出空格:
echo [-neE] [arg …]:输出参数,用空格分隔,后跟一个换行符。
当你使用echo "$x"
,它会根据bash
强制整个x
variables成为一个单词,因此它不会被分割。 你可以看到:
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 3
和abcd
变体显示它在行动。
然后我们用x
variables的两个变体来尝试它。 没有引号的那个表示有"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也是如此。