将多行输出放入变量中

10
我正在编写bash脚本,希望它执行一个命令并逐行处理。例如:
LINES=$(df)
echo $LINES

它将返回所有输出,将换行符转换为空格。

例如:

如果输出应该是:

1
2
3
那么我将获得什么?
1 2 3

如何将命令的输出放入变量中,允许换行仍然保持为换行,以便在打印变量时得到正确的输出?

2个回答

15

通常在bash中,$v 在大多数情况下都会引起问题。几乎总是你真正想要的是双引号中的"$v":


LINES="$(df)"
echo "$LINES"

6
实际上,无论变量分配是否使用引号都可以,因为扩展的结果在分配给变量时不会进行词法分割。但是加上引号也不会有任何影响,并且更容易训练肌肉记忆,只需在所有扩展周围键入双引号即可。 - Jan Hudec

7
不会。 $(something) 只会删除行末换行符。
echo 命令中的参数会根据空格进行分割,然后用空格将它们拼接在一起。为了保留空白字符,您需要再次使用引号。
echo "$LINES"

注意,赋值语句中不需要使用引号;扩展的结果在变量赋值和case参数中不会被分割成单词。但是可以加上引号,这样更容易记住总是要加上引号。

你确定吗?我只是用LINES=$(df); echo "${LINES}"得到了预期的结果,也许我们的环境中IFS不同。尽管如此,在@kubanczyk的答案中,$(df)比单反引号引用更好,所以还是给个赞。 - nhed
@nhed:没错...将值赋给变量永远不会分裂。当我在这里测试时,我被错误消息搞糊涂了,结果发现它来自其他地方。 - Jan Hudec
@nhed:$()比``更受青睐,因为它更易于查看和嵌套。 - Jan Hudec
1
@kubanczyk 反引号已经过时了,首先它不易于阅读(在双引号内使用反引号),其次它限制了你的操作。嵌入两个命令,例如:echo $$ > /tmp/mypid; LINES=$(ps $(cat /tmp/mypid)); echo "${LINES}" 是可行的...但是使用反引号就不行了。 - nhed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接