在 Ubuntu 14.04.1 中运行此命令:
./script.sh MyVM take
为什么echo
函数中的行可以list_snapshot
工作(它打印这 3 个变量的值)但是echo
中的行take_snapshot
不能打印变量的值$output
而$old_snapshot_name
只能打印的值$machine_name
?
请注意,当我运行时脚本会起作用./script.sh MyVM take
,它会删除旧快照并创建新快照。
#! /bin/sh
if [ ! "$1" ]; then
echo "Usage: $0 <vmname> list|take"
exit 1
else
machine_name=$1
fi
list_snapshot () {
output=$(VBoxManage snapshot "$machine_name" list)
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
}
case "$2" in
list)
list_snapshot
;;
take)
take_snapshot
;;
*)
echo "Usage: $0 <vmname> list|take"
exit 1
;;
esac
输出不含-x
:./snapshotVM.sh RancherOS-tools take
Machine 'RancherOS-tools' has '4' snapshots:
' Name: RancherOS-tools.2015.11.03-11.25.12 (UUID: 7afef8ee-1915-4494-9634-add82e1a613f)
Name: RancherOS-tools.2015.11.03-11.25.40 (UUID: 79a53543-377e-4a74-80ca-751883a7787b)
Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051) *'
Deleting old snapshot '' for machine 'RancherOS-tools'...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Machine 'RancherOS-tools' has '3' snapshots:
' Name: RancherOS-tools.2015.11.03-11.25.40 (UUID: 79a53543-377e-4a74-80ca-751883a7787b)
Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051) *'
Taking new snapshot 'RancherOS-tools.2015.11.03-11.35.20' for machine 'RancherOS-tools'...
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Snapshot taken. UUID: 5195881b-113b-448a-81e3-98a121c8fbfe
输出为-x
:./snapshotVM.sh RancherOS-tools take
dy@dy:~$ ./snapshotVM.sh RancherOS-tools take
+ [ ! RancherOS-tools ]
+ machine_name=RancherOS-tools
+ take_snapshot
+ echo
+ list_snapshot
+ VBoxManage snapshot RancherOS-tools list
+ output= Name: RancherOS-tools.2015.11.03-11.25.40 (UUID: 79a53543-377e-4a74-80ca-751883a7787b)
Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *
+ echo Name: RancherOS-tools.2015.11.03-11.25.40 (UUID: 79a53543-377e-4a74-80ca-751883a7787b)
Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *
+ grep -c UUID
+ count=4
+ echo Machine 'RancherOS-tools' has '4' snapshots: \n ' Name: RancherOS-tools.2015.11.03-11.25.40 (UUID: 79a53543-377e-4a74-80ca-751883a7787b)
Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *'
Machine 'RancherOS-tools' has '4' snapshots:
' Name: RancherOS-tools.2015.11.03-11.25.40 (UUID: 79a53543-377e-4a74-80ca-751883a7787b)
Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *'
+ return 4
+ [ 4 -gt 3 ]
+ echo
+ head -1
+ grep -o UUID: (.{36})
+ old_snapshot_name=
+ echo Deleting old snapshot '' for machine 'RancherOS-tools'...
Deleting old snapshot '' for machine 'RancherOS-tools'...
+ VBoxManage snapshot RancherOS-tools delete
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
+ list_snapshot
+ VBoxManage snapshot RancherOS-tools list
+ output= Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *
+ echo Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *
+ grep -c UUID
+ count=3
+ echo Machine 'RancherOS-tools' has '3' snapshots: \n ' Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *'
Machine 'RancherOS-tools' has '3' snapshots:
' Name: RancherOS-tools.2015.11.03-11.32.10 (UUID: 25a942fe-2d0a-4290-a98e-7d16ec4c60bd)
Name: RancherOS-tools.2015.11.03-11.34.58 (UUID: 02af926b-396c-4ce6-bfb3-5e953de5a051)
Name: RancherOS-tools.2015.11.03-11.35.20 (UUID: 5195881b-113b-448a-81e3-98a121c8fbfe) *'
+ return 3
+ [ 3 -gt 3 ]
+ date +%Y.%m.%d-%H.%M.%S
+ current_time=2015.11.03-11.37.46
+ snapshot_name=RancherOS-tools.2015.11.03-11.37.46
+ echo Taking new snapshot 'RancherOS-tools.2015.11.03-11.37.46' for machine 'RancherOS-tools'...
Taking new snapshot 'RancherOS-tools.2015.11.03-11.37.46' for machine 'RancherOS-tools'...
+ VBoxManage snapshot RancherOS-tools take RancherOS-tools.2015.11.03-11.37.46 --live
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Snapshot taken. UUID: 0e11c8d0-130c-4508-a2be-8692fc9316bd
更新:看起来我遇到了一些变量范围问题,重新设计我的代码后,删除 while 循环,现在它可以工作了。
#! /bin/sh
# usage:
# $0 <vmname> list : list all snapshot
# $0 <vmname> take : delete old snapshot name startwith "Backup" and leave 3 "Backup" snapshot
#set -x
if [ ! "$1" ]; then
echo "Usage: $0 <vmname> list|take"
exit 1
else
machine_name=$1
fi
list_snapshot () {
output=$(VBoxManage snapshot "$machine_name" list)
count=$(echo "$output" | grep -c 'UUID')
echo "Machine $machine_name has $count snapshots: "
echo "$output"
}
take_snapshot () {
output=$(VBoxManage snapshot "$machine_name" list)
count=$(echo "$output" | grep -c 'Backup')
echo "Machine $machine_name has $count snapshots: "
echo "$output"
if [ "$count" -ge 3 ]; then
old_snapshots_uuid=$(echo "$output" | grep "Backup" | grep -Eo 'UUID: .{36}' | cut -c 7-42 | head -$((count-2)))
for u in $old_snapshots_uuid; do
echo "Deleting old snapshot $u for machine $machine_name..."
VBoxManage snapshot "$machine_name" delete "$u"
done
fi
current_time=$(date "+%Y.%m.%d-%H.%M.%S")
snapshot_name="Backup".$machine_name.$current_time
echo "Taking new snapshot $snapshot_name for machine $machine_name..."
VBoxManage snapshot "$machine_name" take "$snapshot_name"
}
case "$2" in
list)
list_snapshot
;;
take)
take_snapshot
;;
*)
echo "Usage: $0 <vmname> list|take"
exit 1
;;
esac
答案1
你不能;在函数中声明/初始化的变量仅在该函数的范围内可见。
同样,在您的特定情况下,如果您运行./script.sh MyVM take
,list_snapshot()
甚至不会运行;output
应该如何声明/初始化(以及应该如何old_snapshot_name
声明/初始化,因为它的声明/初始化依赖于output
尚未声明/初始化的?)
为了使其output
对所有函数可见,而不管实际运行的是哪些函数,请将其声明/初始化移到 之外list_snapshot()
,例如在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