bash for循环中出现意外的换行符

ehi*_*ime 3 bash for-loop

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

bash-4.3$ vboxmanage list vms
  "node1" {280482b5-3913-4019-aa9a-383f1f3131a1}
  "test_default_1419033096698_75346" {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}
Run Code Online (Sandbox Code Playgroud)

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

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}
Run Code Online (Sandbox Code Playgroud)

我希望得到以下内容?

  ==> "node1" {280482b5-3913-4019-aa9a-383f1f3131a1}
  ==> "test_default_1419033096698_75346" {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}
Run Code Online (Sandbox Code Playgroud)

所以我试着这样做......

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}
Run Code Online (Sandbox Code Playgroud)

结果如预期的那样在一条线上......

我很好奇的是为什么第一个例子这样做,我非常清楚应该用a读取多行while loop.我更为好奇为什么这样做,我对实施for解决方案不感兴趣.

Tom*_*ech 6

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

for name in "node1" {280482b5-3913-4019-aa9a-383f1f3131a1} "test_default_1419033096698_75346" {9a2f7b6b-33d8-4997-9c35-9b86f3d183b6}
do
    echo "$name"
done
Run Code Online (Sandbox Code Playgroud)

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

正如常见问题解答告诉你的那样,请改用while read循环:

while read -r name
do
    echo "$name"
done < <(vboxmanage list vms)
Run Code Online (Sandbox Code Playgroud)

正如FAQ所提到的,如果你想保留前导空格和尾随空格,你应该使用IFS= while read -r name.这将IFS在命令持续时间内清除输入字段分隔符的值.