我对tar,xz有一些简单的备份脚本,并保存到SMB共享一些文件夹,并且想在命令的一部分中使用变量($ invocation)。
不幸的是,在脚本运行时,它会记住变量$ location为空,其结果是没有备份
([xz: /mnt/backupMatrix//2020-06-05T00-27.tar.xz: No such file or directory
)。
我确实知道为什么它不起作用,但是如何正确执行?如何在启动之前立即“重新加载”变量$ invocation(具有新设置的$ location),而无需将整个调用硬编码到函数中?
下面的代码。
#! /bin/bash
invocation="xz --threads=8 -z -9 -v -v - > /mnt/backupMatrix/$location/$(date +%Y-%m-%dT%H-%M).tar.xz"
function mcuser2
{
#backup mcuser2
location="mcuser2"
echo "setting var location to: $location"
echo "Stopping minecraft2.service"
sudo systemctl stop minecraft2.service
echo "Stopped minecraft2.service"
echo "Starting taring mcuser2"
# --exclude='/home/mcuser2/world'
tar cpf - --exclude='/home/mcuser2/plugins/dynmap/web/tiles' /home/mcuser2/ | $invocation
echo "Completed taring mcuser2"
echo "starting minecraft2.service"
sudo systemctl start minecraft2.service
echo "started successfully minecraft2.service"
}
case "$1" in
mcuser2)
mcuser2
;;
esac
由于您无条件地在函数中设置了location
,所以最简单的方法是从函数中移出该行并将其放置在设置invocation
之前。
一种替代方法是使用更多变量:
: "${XZ:=xz}"
: "${XZOPTIONS:=--threads=8 -z -9 -v -v -}"
: "${TSTAMP:=$(date +%Y-%m-%dT%H-%M)}"
: "${BASEDIR:=/mnt/backupMatrix}"
: "${TAR:=tar}"
: "${TAROPTIONS:=-cpf -}"
STARTDIR="/home/mcuser2" # $HOME?
EXCLUDE="--exclude=$STARTDIR/plugins/dynmap/web/tiles"
function mcuser2
{
#backup mcuser2
location="mcuser2"
echo "setting var location to: $location"
echo "Stopping minecraft2.service"
sudo systemctl stop minecraft2.service
echo "Stopped minecraft2.service"
echo "Starting tarring mcuser2"
$TAR $TAROPTIONS - "$EXCLUDE" "$STARTDIR" |
$XZ $XZOPTIONS > "$BASEDIR/$location/$TSTAMP.tar.xz"
echo "Completed tarring $STARTDIR"
echo "starting minecraft2.service"
sudo systemctl start minecraft2.service &&
echo "started successfully minecraft2.service"
}
警告:未经测试的Shell脚本。
我可能不会在归档文件中包含完整路径(无论如何,GNU tar
都会删除前导斜线);我将cd
移至起始目录,并指定.
作为要备份的目录-可能在-C "$STARTDIR"
命令行上使用tar
。我希望这也需要我使用相对路径而不是绝对路径来更改排除选项。
您还可以考虑将shell数组用于选项列表。