我的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
作为解决方案并不感兴趣。
答案 0 :(得分:6)
你的循环基本上是这样的:
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)
正如FAQ所提到的,如果你想保留前导空格和尾随空格,你应该使用IFS= while read -r name
。这将在命令持续时间内清除输入字段分隔符IFS
的值。