刚在调用变量之前刷新它?

问题描述 投票:-1回答: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
bash variables backup tar xz
1个回答
0
投票

由于您无条件地在函数中设置了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数组用于选项列表。

© www.soinside.com 2019 - 2024. All rights reserved.