Получить список запущенных виртуальных машин с помощью VBoxManage

Я хочу прокрутить свою текущую виртуальную машину и вернуть только то, что находится между кавычками.

Итак, эта команда:

VBoxManage list runningvms

возвращает:

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

И я хочу, чтобы он возвращался:

UbuntuServer

Это то, что я до сих пор (провал):

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

Ответы

Ответ 1

Предупреждение: все это рискованно, если ваши имена виртуальных машин имеют в них символы оболочки оболочки или содержат пробелы.


Вы можете сделать что-то вроде этого, если есть только одна работающая 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

Ответ 2

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

Ответ 3

для однострочных вентиляторов:

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

Ответ 4

Чтобы проверить каждую строку при ее чтении, безопасный способ сделать это - написать регулярное выражение и использовать 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

Обратите внимание на преимущества этого подхода:

  • Он не делает необоснованных предположений, например, исключая виртуальные машины с пробелами или литералами цитат в своих именах из поддержки.
  • Он обнаруживает любую строку, которая не соответствует ожидаемому шаблону, а не ведет себя непредвиденным образом при наличии таких значений.
  • Он по-прежнему ведет себя правильно с данными, которые соответствуют шаблону, но имеет непредвиденные значения. (Например, виртуальная машина с именем * не будет иметь имя, которое молча заменит имя файла в текущем каталоге).
  • Он не включает в себя инструменты, внешние по отношению к оболочке, такие как sed, cut, & c., но полагается исключительно на функциональность с оболочкой - см. BashFAQ # 1, документирующий использование while read и wiki bash -hackers 'для регулярного выражения, соответствующего документирование [[ $string =~ $re ]].

Ответ 5

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

Пропустить:

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

Это сломается, если ваш компьютер имеет пробелы в своем имени.