Bashで変数を介してオプションを渡すことは機能しません。

Bashで変数を介してオプションを渡すことは機能しません。

次のコマンドを実行すると、非常に奇妙な動作が発生しました。問題を説明します。

次の簡単な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[@]}"

これにより、項目が個別に展開され、コマンドに引数として渡されます。

おすすめ記事