Предикат Bash с несколькими логическими функциями
Написание сценария bash и не знаю, как использовать более одной функции в предикате:
#!/bin/bash
set -x
WAITED=0
registered () {
VBoxManage showvminfo --machinereadable "$1" 2>/dev/null | grep UUID=
}
not_running () {
VBoxManage showvminfo --machinereadable "$1" 2>/dev/null | grep 'VMState="poweroff"'
}
while registered "$1" && not_running "$1" && [ $WAITED -lt 60 ]
do
echo "LOOP"
VBoxManage controlvm "$1" acpipowerbutton 2>/dev/null
((WAITED++))
sleep 1
done
if registered "$1" && ! not_running "$1"
then
echo "POWEROFF"
VBoxManage controlvm "$1" poweroff 2>/dev/null
sleep 1
fi
if registered "$1"
then
echo "UNREG"
VBoxManage unregistervm "$1" --delete 2>/dev/null
fi
Выход:
./stop_vm 1b76
+ WAITED=0
+ registered 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep UUID=
UUID="cee02a9a-9a9a-4313-b297-479ca0a41e01"
+ not_running 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep 'VMState="poweroff"'
+ registered 1b76
+ grep UUID=
+ VBoxManage showvminfo --machinereadable 1b76
UUID="cee02a9a-9a9a-4313-b297-479ca0a41e01"
+ not_running 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep 'VMState="poweroff"'
+ echo POWEROFF
POWEROFF
+ VBoxManage controlvm 1b76 poweroff
+ sleep 1
+ WAITED=0
+ registered 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep UUID=
UUID="cee02a9a-9a9a-4313-b297-479ca0a41e01"
+ not_running 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep 'VMState="poweroff"'
VMState="poweroff"
+ '[' 0 -lt 60 ']'
+ echo LOOP
LOOP
+ VBoxManage controlvm 1b76 acpipowerbutton
+ (( WAITED++ ))
+ sleep 1
+ registered 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep UUID=
UUID="cee02a9a-9a9a-4313-b297-479ca0a41e01"
+ echo UNREG
UNREG
+ VBoxManage unregistervm 1b76 --delete
cara@bmserver1-sandbox:~/vm$ + registered 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep UUID=
+ registered 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep UUID=
+ registered 1b76
+ VBoxManage showvminfo --machinereadable 1b76
+ grep UUID=
Почему POWEROFF предшествует LOOP? Там нет внешних петель. Как правильно написать предикаты с несколькими функциями?
1 ответ
Проблема может быть вызвана рекурсивным вызовом вашего скрипта системой VBox при выполнении тела while
Цикл в разделе "LOOP" вашего кода. Если это так, то вам нужно будет переделать сценарий, чтобы избежать рекурсии (с помощью какого-либо механизма мьютекса), или выполнить необходимые действия в другом сценарии.
Вы, вероятно, должны процитировать ваше расширение позиционных аргументов (например, "$1"
), и ваше использование return $?
является избыточным (функция, предоставленная самой себе, всегда возвращает код возврата последнего оператора, выполненного перед выходом из функции).