bash - bash for 循环中的意外换行符

标签 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}

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

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 循环 读取多行。我更好奇为什么要这样做,我对将 for 作为解决方案实现不感兴趣。

最佳答案

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

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 的值。

关于bash - bash for 循环中的意外换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27611094/

相关文章:

string - 在bash中获取多个空格后的字符串

php - 使用 PHP MYSQL 和 foreach 语句使用多级菜单

linux - shell 脚本中的嵌套 Case 语句 |获取语​​法错误

linux - cmake execute_process 找不到源命令

JAVA不进入for循环

ios - 如何在循环内增加索引并停止枚举?

C++ 创建数组?

c - C中的for循环格式

linux - 无法更改 tclsh 路径

bash - 递归剪切子文件夹中的文件后缀