-1

我有一些简单的备份脚本来 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
4

1 回答 1

1

由于您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 脚本。

我可能不会在存档中包含完整路径(GNUtar无论如何都会删除前导斜杠);我将cd转到开始目录并指定.要备份的目录 - 可能-C "$STARTDIR"tar命令行上使用。我希望这也需要我使用相对路径而不是绝对路径来更改排除选项。

您还可以考虑将 shell 数组用于选项列表。

我不相信我会在这个脚本中使用一个函数。它似乎并没有太大帮助。

于 2020-06-05T04:17:22.677 回答