【问题标题】:Unexpected newlines in bash for loopbash for 循环中出现意外的换行符
【发布时间】:2014-12-22 22:02:39
【问题描述】:

我在尝试循环以下内容的 BASH 代码中遇到换行问题:

bash-4.3$ vboxmanage list vms
  "node1" {280482b5-3913-4019-aa9a-383f1f3131a1}
  "test_default_1419033096698_75346" {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}

知道了,我在下面得到了意想不到的结果

for name in $(vboxmanage list vms); do
    echo "==> $name"
done

  ## Prints
  ==> "node1"
  ==> {280482b5-3913-4019-aa9a-383f1f3131a1}
  ==> "test_default_1419033096698_75346"
  ==> {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}

我希望得到以下内容?

  ==> "node1" {280482b5-3913-4019-aa9a-383f1f3131a1}
  ==> "test_default_1419033096698_75346" {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}

所以我尝试这样做,然后......

for name in "$(vboxmanage list vms)"; do
    echo "==> $name"
done

  ==> "node1" {280482b5-3913-4019-aa9a-383f1f3131a1}
  "test_default_1419033096698_75346" {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}

结果如预期在一行中......

我很好奇的是为什么第一个示例会这样做,我很清楚应该使用while loop 读取多行。我对它为什么这样做更好奇,我对将for 实现为解决方案不感兴趣。

【问题讨论】:

标签: bash for-loop


【解决方案1】:

你的循环本质上是这样的:

for name in "node1" {280482b5-3913-4019-aa9a-383f1f3131a1} "test_default_1419033096698_75346" {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}
do
    echo "$name"
done

也就是说,每个单独的单词都在循环的单独迭代中打印。

正如the FAQ 会告诉你的那样,请改用while read 循环:

while read -r name
do
    echo "$name"
done < <(vboxmanage list vms)

正如常见问题解答还提到的,如果您想保留前导和尾随空格,您应该使用IFS= while read -r name。这会在命令执行期间清除输入字段分隔符 IFS 的值。

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多