Você não pode; variáveis declaradas / inicializadas em uma função são visíveis apenas no escopo dessa função.
Além disso, no seu caso específico, se você executar ./script.sh MyVM take
, list_snapshot()
nem será executado; como output
deve ser declarado / inicializado (e como old_snapshot_name
deve ser declarado / inicializado, pois sua declaração / inicialização depende de output
, que não foi declarado / inicializado?)
Para tornar output
visível para todas as funções e independentemente de quais funções são realmente executadas, mova sua declaração / inicialização para fora de list_snapshot()
, por exemplo, após a definição de take_snapshot()
:
#! /bin/sh
if [ ! "$1" ]; then
echo "Usage: $0 <vmname> list|take"
exit 1
else
machine_name=$1
fi
list_snapshot () {
count=$(echo "$output" | grep -c 'UUID')
echo "Machine '$machine_name' has '$count' snapshots: \n '$output'"
return "$count"
}
take_snapshot () {
echo "$output"
while (list_snapshot; [ $? -gt 3 ])
do
old_snapshot_name=$(echo "$output" | grep -o 'UUID: (.{36})' | head -1)
echo "Deleting old snapshot '$old_snapshot_name' for machine '$machine_name'..."
VBoxManage snapshot "$machine_name" delete "$old_snapshot_name"
done
current_time=$(date "+%Y.%m.%d-%H.%M.%S")
snapshot_name=$machine_name.$current_time
echo "Taking new snapshot '$snapshot_name' for machine '$machine_name'..."
VBoxManage snapshot "$machine_name" take "$snapshot_name" --live
}
output=$(VBoxManage snapshot "$machine_name" list)
case "$2" in
list)
list_snapshot
;;
take)
take_snapshot
;;
*)
echo "Usage: $0 <vmname> list|take"
exit 1
;;
esac