【发布时间】:2012-02-01 13:05:14
【问题描述】:
我正在用 bash 编写一个脚本,我希望它执行一个命令并分别处理每一行。例如:
LINES=$(df)
echo $LINES
它将返回所有输出转换新行与空格。
示例:
如果输出应该是:
1
2
3
那么我会得到
1 2 3
如何将命令的输出放入变量中,让新行仍然是新行,以便在打印变量时得到正确的输出?
【问题讨论】:
我正在用 bash 编写一个脚本,我希望它执行一个命令并分别处理每一行。例如:
LINES=$(df)
echo $LINES
它将返回所有输出转换新行与空格。
示例:
如果输出应该是:
1
2
3
那么我会得到
1 2 3
如何将命令的输出放入变量中,让新行仍然是新行,以便在打印变量时得到正确的输出?
【问题讨论】:
通常在 bash 中$v 在大多数情况下都是自找麻烦。几乎总是你真正的意思是"$v" in 双引号:
LINES="$(df)"
echo "$LINES"
【讨论】:
不,不会。 $(something) 只去除尾随的换行符。
echo 的参数扩展在空格上拆分,然后 echo 将单独的参数与空格连接起来。要保留空格,您需要再次引用:
echo "$LINES"
注意,赋值确实不需要被引用;扩展的结果在分配给变量和case 的参数中不是分词的。但是它可以被引用,而且学习总是把引号放在里面会更容易。
【讨论】:
LINES=$(df); echo "${LINES}" 就得到了预期的结果,也许 IFS 在我们的环境中有所不同。仍然 +1 作为$(df) 比@kubanczyk 的答案中的单个反引号更好
$() 比 `` 更受欢迎,因为它更容易看到并且更容易嵌套。
echo $$ > /tmp/mypid; LINES=$(ps $(cat /tmp/mypid)); echo "${LINES}" 有效...与反引号相同不会