Получить список запущенных виртуальных машин с помощью 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
Это сломается, если ваш компьютер имеет пробелы в своем имени.