次のコマンドを実行すると、非常に奇妙な動作が発生しました。問題を説明します。
次の簡単なbashスクリプトを考えてみましょう。
#!/bin/bash
zip -r /var/backup.zip /var/www -x /ignore_dir_1/\*
フォルダwww
全体を再帰的に圧縮し、入らないようにする ignore_dir_1
本当に大丈夫です。
次に、次のようにスクリプトを作成します。
#!/bin/bash
Exclude="/ignore_dir_1/\*"
zip -r /var/backup.zip /var/www -x $Exclude
エラーなしで実行されますが、除外されない ignore_dir_1
。
誰でもこの動作を説明できますか?
- 免責事項:
私は次の選択肢を試しました。
Exclude="/ignore_dir_1/*"
Exclude="/ignore_dir_1/***"
修正する:
@pLumoのおかげで、次のように変数を引用符で囲んで問題を解決しました。
#!/bin/bash
Exclude="/ignore_dir_1/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
これで問題は、Exclude
変数に次のものが含まれているかどうかです。複数のフォルダ、動作しません。つまり、次のようになります。
#!/bin/bash
Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
私はそれを試しましたが、"${Exclude}"
結果はありませんでした。
答え1
書いたら...
Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
、単一の引数としてzip
受け取り、 $Exclude
ファイル間のスペースをパスの一部として扱います。
複数のパラメータをコマンドに渡すには、を使用する必要がありますarray
。
Exclude=("/ignore_dir_1/*" "/ignore_dir_2/*")
zip -r /var/backup.zip /var/www -x "${Exclude[@]}"
これにより、項目が個別に展開され、コマンドに引数として渡されます。
答え2
フルモの忍者:-P
配列を使用することをお勧めします。
#!/bin/bash
echo "directory tree ---------------------------------------------------"
find
echo "without exclusions -----------------------------------------------"
echo zip -sf -r backup.zip .
zip -sf -r backup.zip .
echo "with exclusions --------------------------------------------------"
declare -a Exclude=(ignore_dir_1/\* ignore_dir_2/\*)
echo zip -sf -r backup.zip . -x ${Exclude[@]}
zip -sf -r backup.zip . -x ${Exclude[@]}
echo 'double quoted ${Exclude[@]} --------------------------------------'
echo zip -sf -r backup.zip . -x "${Exclude[@]}"
zip -sf -r backup.zip . -x "${Exclude[@]}"
「テスト実行」の前にディレクトリツリーの結果を表示します。
$ ./script
directory tree ---------------------------------------------------
.
./dir_0
./dir_0/file-1
./dir_0/file-2
./ignore_dir_1
./ignore_dir_1/file-11
./ignore_dir_1/file-12
./ignore_dir_2
./ignore_dir_2/file name with spaces
./ignore_dir_2/file-22
./ignore_dir_2/file-21
./script
without exclusions -----------------------------------------------
zip -sf -r backup.zip .
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
ignore_dir_1/
ignore_dir_1/file-11
ignore_dir_1/file-12
ignore_dir_2/
ignore_dir_2/file name with spaces
ignore_dir_2/file-22
ignore_dir_2/file-21
script
Total 11 entries (621 bytes)
with exclusions --------------------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/file-11 ignore_dir_1/file-12 ignore_dir_2/file-21 ignore_dir_2/file-22 ignore_dir_2/file name with spaces
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
ignore_dir_1/
ignore_dir_2/
script
Total 6 entries (621 bytes)
double quoted ${Exclude[@]} --------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/* ignore_dir_2/*
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
script
Total 4 entries (621 bytes)