使用VBoxManage获取正在运行的VM列表

时间:2011-08-15 19:11:12

标签: bash virtualbox

我想循环运行我正在运行的VM并仅返回引号之间的内容。

所以这个命令:

VBoxManage list runningvms

返回:

"UbuntuServer" {7ef01f8d-a7d5-4405-af42-94d85f999dff}

我只希望它回归:

UbuntuServer

这是我到目前为止(失败):

#!/bin/bash
for machine in `cat VBoxManage list runningvms`; do
        echo "$machine"
done
exit

5 个答案:

答案 0 :(得分:16)

警告:如果您的VM名称中包含shell glob字符或包含空格,则所有这些都有风险。


如果只有一个正在运行的VM,你可以这样做:

read machine stuff <<< $(VBoxManage list runningvms)
echo "$machine"

替代bash数组(相同条件):

vbm=($(VBoxManage list runningvms))
echo "${vbm[0]}"

如果该程序返回多行,则更经典的方法是:

for machine in $(VBoxManage list runningvms|cut -d" " -f 1); do
  echo "$machine"
done

答案 1 :(得分:15)

VBoxManage list runningvms | cut -d '"' -f 2 | while read machine; do
   echo "$machine"
done

答案 2 :(得分:2)

对于单线球迷:

VBoxManage list runningvms | cut -d" " -f 1 | grep -oP "(?<=\").*(?=\")"

答案 3 :(得分:1)

要在阅读时验证每一行,安全的方法是编写正则表达式并使用BASH_REMATCH从中提取匹配组。

使用以下代码:

re='^"(.*)" [{]([0-9a-f-]+)[}]$'
while read -r line; do
  if [[ $line =~ $re ]]; then
    name=${BASH_REMATCH[1]}; uuid=${BASH_REMATCH[2]}
    echo "Found VM with name $name and uuid $uuid" >&2
  else
    echo "ERROR: Could not parse line: $line" >&2
  fi
done < <(VBoxManage list runningvms)

...以及VBoxManage的以下模拟实现(允许没有VirtualBox的人重现测试):

VBoxManage() { printf '%s\n' '"UbuntuServer" {7ef01f8d-a7d5-4405-af42-94d85f999dff}'; }

...输出如下:

Found VM with name UbuntuServer and uuid 7ef01f8d-a7d5-4405-af42-94d85f999dff

注意这种方法的优点:

  • 它没有做出毫无根据的假设,例如从支持中排除名称中带有空格或引用文字的虚拟机。
  • 它检测到任何与预期模式不匹配的行,而不是在出现此类值时以意料之外的方式行事。
  • 对于 匹配模式但具有意外值的数据,它仍能正常运行。 (例如,名为*的虚拟机将不会以当前目录中的文件名静默替换该名称。
  • 它不涉及shell外部的工具,例如sedcut和&amp; c。,但完全依赖于shell-builtin功能 - 请参阅BashFAQ #1记录使用while readthe bash-hackers' wiki on regular expression matching记录[[ $string =~ $re ]]

答案 4 :(得分:0)

VBoxManage list runningvms | sed 's/"//g;s/ .*//'

循环:

for machine in `VBoxManage list runningvms | sed 's/"//g;s/ .*//'` ; do
    echo $machine
done

如果你的机器名称中有空格,这将会中断。