2017-02-21 14 views
0

私は、次のbashの配列があります。使用bashの配列

IGNORED_DIRS=(
    "vendor" 
    "node_modules" 
    "bower_components" 
    "tmp" 
    "backup" 
) 

をそして、私は、これは、このような方法で出力する必要があります

tar -cpzf /var/backups/ --exclude="vendor" --exclude="node_modules" --exclude="bower_components" --exclude="tmp" --exclude="backup" 

はこれまでのところ、私は次のことを試してみました:

for dir in ${IGNORED_DIRS[@]} 
do 
    EXCLUDES=$EXCLUDES" --exclude=\""$dir"\"" 
done 

私は、正確な除外文字列を含む変数になります。私は単純にできると思った。

tar -cpzf /var/backups/ $EXCLUDES 

しかし、それは単純にすべての除外フラグを無視します。誰も私のための解決策を持っていますか?

+0

解決策が見つかったようです。 'EXCLUDES'行をこのEXCLUDES = $ EXCLUDESに置き換えると、--exclude =" $ dir "" '問題を修正するようです。だから、除外ディレクトリを取り巻く引用符はもうありません。奇妙なことに彼は働いています... – Diederik

+0

上記は些細な場合にのみ有効です - ディレクトリ名にスペースを入れてみてください。 –

+1

BTW - all-caps変数名は、オペレーティングシステムまたはシェルに意味を持つ環境変数およびシェル組み込み関数に使用されますが、小文字名はアプリケーション用に予約されています。したがって、独自のシェル変数に小文字の名前を使用すると、誤ってオペレーティングシステムに意味を持つ変数を上書きすることはできません。将来のOSおよびシェルリリースとの互換性を保つ場合は特に重要です。 [関連する仕様](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html)を参照してください。 –

答えて

4

BashFAQ #50で詳しく説明しています。ソリューション要約すると:

extra_args=() 
for dir in "${IGNORED_DIRS[@]}"; do 
    extra_args+=(--exclude="$dir") 
done 

tar -cpz "${extra_args[@]}" -f /var/backups/ 
+0

恐ろしい答え。 – RavinderSingh13

+0

合意。もう一度、助けてくれてありがとう! – Diederik

+1

または、もっと簡単に、 'tar -cpz" $ {IGNORED_DIRS [@] /#/ - exclude =} "-f/var/backups'です。 –

1

@のfavorettiの応答を変更し、むしろ1つの文字列に参加するよりも、項目にアレイを拡張するアレイと${array[@]}を収集するために(..)を使用しています。

IGNORED_DIRS=(
    "vendor" 
    "node_modules" 
    "bower_components" 
    "tmp" 
    "backup" 
) 

for dir in "${IGNORED_DIRS[@]}" 
do 
    EXCLUDES=("${EXCLUDES[@]}" --exclude="$dir") 
done 

tar -cf /var/backup "${EXCLUDES[@]}" 
+0

主に 'tar'コマンド自体の正しい場所に' $ {EXCLUDES [@]} 'が必要です。 bash構文が正しいかどうか。 – favoretti

+0

ありがとうございます。たくさんのことを学ぶ! – Diederik

+0

GNU 'tar'はその点で柔軟ですが、それはPOSIX仕様を超えています。 (確かに '--exclude'は仕様外です)。 –