我编写了一个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
答案 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}}