2017-08-05 10 views
1

ディレクトリのコンテンツを.tarファイルにバックアップするためのBashスクリプトを書いています。スクリプトをもっと整理し、移植性があり、共有可能なものに更新するつもりです。しかし、私の人生はコード内のバグを理解することができません。その場合、出力は$OUTDIR$INDIRと同じパスに変更すべきではありません。ディレクトリをバックアップするためのbashスクリプトによる奇妙な出力

-dがfileコマンドのパラメータに追加されると、スクリプトの実際の要点であるtarコマンドで使用される文字列が表示され、独自のパラメータが定義されます。私はコードのその部分を2回書き直しました。なぜ出力が毎回違うのか理解できません。

#!/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 

これは、単一引用符がthaの変数を展開することができていない出力

[email protected]:~$ bakdir -d 
Input directory: /home/gnomop 
Output directory: /home/gnomop 
Output file path: /home/gnomop/bak_20170804_2123.tar 
Log file path:  /home/gnomop/bak.log 
[email protected]:~$ bakdir -d /home/other 
Input directory: /home/other 
Output directory: /home/other 
Output file path: /home/other/bak_20170804_2124.tar 
Log file path:  /home/other/bak.log 
[email protected]:~$ bakdir -d /home/other /home/other/bak 
Input directory: /home/other 
Output directory: /home/other 
Output file path: /home/other/bak_20170804_2124.tar 
Log file path:  /home/other/bak.log 

答えて

1

です。このように

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

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

それは働いた。どうもありがとうございました –

0

@whoanは、当面の問題についての権利ですが、私は引数解析の完全な書き直しをお勧めしたいあなたは、この行を修正する必要が

それをより簡単にするロジック。 -dのようなオプションの場合は、それをチェックして()引数リストから削除して、位置パラメータを設定するのが最善の方法です。たとえば、INDIR$1(設定されている場合)または$(pwd)のいずれかになります。それについての複雑さは時々$2であることはありません。

シェルスクリプトでは小文字(または大文字と小文字が混在する)の変数名を使用することをお勧めします。大文字の変数が特別な意味を持ち、間違って悪いもの発生する可能性があります。 (古典的な例では、コマンドの検索にディレクトリのリスト以外のものに$PATHを使用しようとしています。その時点で、「コマンドが見つかりません」というエラーがたくさん出てきます。)また、すべてを囲むように二重引用符変数参照。彼らが必要ではない場所がありますが、それらを離れると奇妙なバグを引き起こす場所がたくさんあります。最後に、変数が設定されていない場合、代替文字列を使用するためのシェルショートカットがあります。は、$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}" 
関連する問題