【问题标题】:place a multi-line output inside a variable在变量中放置多行输出
【发布时间】:2012-02-01 13:05:14
【问题描述】:

我正在用 bash 编写一个脚本,我希望它执行一个命令并分别处理每一行。例如:

LINES=$(df)
echo $LINES

它将返回所有输出转换新行与空格。

示例:

如果输出应该是:

1
2
3

那么我会得到

1 2 3

如何将命令的输出放入变量中,让新行仍然是新行,以便在打印变量时得到正确的输出?

【问题讨论】:

    标签: bash bash4


    【解决方案1】:

    通常在 bash 中$v 在大多数情况下都是自找麻烦。几乎总是你真正的意思是"$v" in 双引号

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

    【讨论】:

    • 其实赋值给变量都不需要引号,因为赋值给变量时展开的结果没有分词。但它们不会造成任何伤害,而且更容易训练你的肌肉记忆力,只需在所有展开式周围输入双引号。
    【解决方案2】:

    不,不会。 $(something) 只去除尾随的换行符。

    echo 的参数扩展在空格上拆分,然后 echo 将单独的参数与空格连接起来。要保留空格,您需要再次引用:

    echo "$LINES"
    

    注意,赋值确实需要被引用;扩展的结果在分配给变量和case 的参数中不是分词的。但是它可以被引用,而且学习总是把引号放在里面会更容易。

    【讨论】:

    • 你确定吗?我只使用LINES=$(df); echo "${LINES}" 就得到了预期的结果,也许 IFS 在我们的环境中有所不同。仍然 +1 作为$(df) 比@kubanczyk 的答案中的单个反引号更好
    • @nhed: 对...对变量的赋值永远不会分裂。当我在这里测试时,我被错误消息弄糊涂了。
    • @nhed: $() 比 `` 更受欢迎,因为它更容易看到并且更容易嵌套。
    • @kubanczyk 反引号是老派,首先它不容易看(双引号内的反引号),其次它限制了你可以做的事情。嵌入 2 个命令,例如:echo $$ > /tmp/mypid; LINES=$(ps $(cat /tmp/mypid)); echo "${LINES}" 有效...与反引号相同不会
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多