带有bash脚本的奇怪输出,用于备份目录

时间:2017-08-05 00:41:03

标签: bash if-statement

我编写了一个Bash脚本,用于将目录的内容备份到ngAfterViewInit() { this.slides.onlyExternal = true; } 文件中。我打算将脚本更新为更具组织性,可移植性和可共享性的内容。但是,我不能为我的生活理解我的代码中的错误,其中一个场合的输出不应该将.tar更改为与$OUTDIR相同的路径。

每当$INDIR附加到文件命令的参数时就会发生这种情况,这些参数应显示脚本实际要点中使用的字符串-d命令,以定义它&#39 ; s自己的参数。我已经两次重写了我的代码部分,我无法理解为什么输出每次都不同。

tar

这是输出

#!/bin/bash
# Script will only back up an accessible directories
# Any directories that require 'sudo' will not work.

if [[ -z $1 ]]; then                    # This specifically
    INDIR=$(pwd); debug=false;          # is the part where 
elif [[ $1 == '-d' ]]; then             # the 'debug' variable 
    debug=true;                        # is tampering with 
    if [[ -z $2 ]]; then INDIR=$(pwd); # the output somehow.
    else INDIR=$2; fi
else 
    INDIR=$1; debug=false; fi

if [[ -z $2 ]]; then
    OUTDIR=$INDIR
elif [[ '$2' = '$INDIR' ]]; then
    if [[ -z $3 ]]; then OUTDIR=$INDIR;
    else OUTDIR=$3; fi
else
    OUTDIR=$2; fi

FILENAME=bak_$(date +%Y%m%d_%H%M).tar
FILEPATH=$OUTDIR'/'$FILENAME
LOGPATH=$OUTDIR'/bak.log'

if [[ "$debug" = true ]]; then
    echo "Input directory:  "$INDIR
    echo "Output directory: "$OUTDIR
    echo "Output file path: "$FILEPATH
    echo "Log file path:        "$LOGPATH
else
    tar --exclude=$FILEPATH --exclude=$LOGPATH \
    -zcvf $FILEPATH $INDIR > $LOGPATH
fi

2 个答案:

答案 0 :(得分:1)

单引号不允许变量扩展。

您需要更正此行:

elif [[ '$2' = '$INDIR' ]];

以这种方式:

elif [[ "$2" = "$INDIR" ]];

答案 1 :(得分:0)

@whoan关于直接问题是正确的,但我建议完全重写解析逻辑的参数以使其更简单。对于像-d这样的选项,最好的办法是检查它(/它们),然后用shift从参数列表中删除它们,然后设置位置参数。例如,这意味着INDIR$1(如果已设置)或$(pwd);没有任何复杂的问题有时是$2

此外,最好在shell脚本中使用小写(或大小写混合大小写)变量名称,因为有大量具有特殊含义的全大写变量,如果你不小心使用其中一个......坏的东西可以发生。 (经典的例子是尝试将$PATH用于搜索命令的目录列表之外的其他内容,此时你开始收到很多“命令未找到”错误。)另外,最好放双 - 引用所有变量引用;有些地方他们没有必要,但有很多地方让他们离开可能会导致奇怪的错误。最后,如果未设置变量,则有一个使用备用字符串的shell快捷方式:indir="${1:-$(pwd)}"如果设置为$indir,则将$1设置为$(pwd),并设置为if [ "$1" = "-d" ]; then debug=true shift # remove -d from the argument list, to simplify parsing the positional parameters else debug=false fi indir="${1:-$(pwd)}" outdir="${2:-$indir}" 否则。

{{1}}