【发布时间】:2017-12-04 21:35:30
【问题描述】:
我正在尝试获取正在运行的 VirtualBox VM(UUID)的列表并将它们放入一个数组中。下面的命令产生下面的输出:
$ VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}'
f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a
46b285c3-cabd-4fbb-92fe-c7940e0c6a3f
83f4789a-b55b-4a50-a52f-dbd929bdfe12
4d1589ba-9153-489a-947a-df3cf4f81c69
我想把这些 UUID 放入一个数组中(甚至可能是一个关联数组供以后使用,但现在一个简单的数组就足够了)
如果我执行以下操作:
array1="( $(VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}') )"
命令
array1_len=${#array1[@]}
echo $array1_len
输出“1”,因为只有 1 个元素。如果我打印出元素:
echo ${array1[*]}
我得到了所有 UUID 的一行
( f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a 46b285c3-cabd-4fbb-92fe-c7940e0c6a3f 83f4789a-b55b-4a50-a52f-dbd929bdfe12 4d1589ba-9153-489a-947a-df3cf4f81c69 )
我做了一些研究(Bash Guide/Arrays 关于如何解决这个问题,并通过命令替换和重定向发现了这个问题,但它产生了一个空数组
while read -r -d '\0'; do
array2+=("$REPLY")
done < <(VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}')
我显然遗漏了一些东西。我在这个网站上查看了几个类似的问题,例如:
- Reading output of command into array in Bash
- AWK output to bash Array
- Creating an Array in Bash with Quoted Entries from Command Output
不幸的是,没有人提供帮助。在弄清楚如何获取输出并将其分配给数组方面,我将不胜感激。
我在 macOS 10.11.6(El Captain)和 BASH 版本 3.2.57 上运行它
【问题讨论】:
-
删除双引号:
array1=( $(VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}') ),(条目将受到分词和路径名扩展的影响,但这似乎不是问题。) -
你和你的
while也很亲密。如果您将其更改为:while read -r; do,它也可以工作。 -
@John1024 - 双引号做到了。出于好奇,(即使它没有实际意义),如果有空格导致分词,因为引号使整个输出成为单个长字符串,我将如何处理?
-
@PesaThe - 谢谢!我认为我必须根据我阅读/理解的内容来解释一个空字符)。