6

我有一个包含几行的文件。在shell中使用cat/more/less [file]时,
内容逐行显示

执行以下命令时:

temp=`cat [file]`
echo $temp

内容显示在一行中。

有没有办法在设置环境变量时保留行尾然后回显它?

谢谢

4

3 回答 3

16

是的:

temp=`cat [file]`
echo "$temp"

魔法就在周围的引号中$temp;没有他们,echo得到这些论点:

echo line1\nline2\nlin3

shell 解析算法将在空白处拆分命令行,因此会echo看到三个参数。如果引用变量,echo将看到一个参数,并且 shell 解析不会触及引号之间的空格。

于 2012-09-24T12:01:45.713 回答
0

这是一个超精确的答案:进程替换到变量中不会保留:

  • 任何 ASCII NUL
  • 任意数量的尾随换行符

只有后者可以解决:

temp=$(realprocess; echo x)  ## Add x to the end to preserve trailing newlines
temp=${temp%x}  ## Remove the x again (keeping originally trailing newlines)

如果要显示变量的真实内容,请使用printf. echo添加一个额外的换行符,并且不可靠(-n例如,当输入以字符串开头时)。

在任何情况下,请始终引用您的变量,否则 shell 会将它们在空格上拆分为任意数量的参数!

printf %s "$temp"

通常,将文件的完整内容保存在 shell 变量中并不是您想要的。有文件。

于 2012-09-24T14:24:49.227 回答
-1

如果我执行以下操作,则会保留换行符:

echo a >> test
echo b >> test
temp=`cat test`
echo $temp
于 2012-09-24T12:01:21.707 回答