次のコマンドを実行すると、非常に奇妙な動作が発生しました。問題を説明します。
次の簡単な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[@]}"
これにより、項目が個別に展開され、コマンドに引数として渡されます。