配列変数を介してプログラムにパラメータを渡す

配列変数を介してプログラムにパラメータを渡す

注:以下の質問が含まれていrsyncますが、いいえに関する質問ですrsync。 zsh 配列に関する質問です。


EXCLUDESこのように変数を初期化すると

EXCLUDES=( --exclude=/foo --exclude=/bar --exclude=/baz )

その後、コマンドを実行すると

rsync -a $EXCLUDES / /some/target

/foo...では、/barおよびが/baz実際にコピーされていないことを確認しました/some/target

EXCLUDE_ITEMSしかし、今こう言いましょう。

EXCLUDE_ITEMS=( /foo /bar /baz )

...このようにEXCLUDEを初期化します。

EXCLUDES=()
for item in $EXCLUDE_ITEMS
do
    EXCLUDES+=( "--exclude='$item'" )
done

...またはこれ

EXCLUDES=( $(for item in $EXCLUDE_ITEMS; do echo "--exclude='$item'"; done) )

...それで、両方の場合を実行した後

rsync -a $EXCLUDES / /some/target

...これで除外されたディレクトリは次のとおりです。いいえ譲渡対象から除外されます。

EXCLUDES(ターミナルに入力される)コマンドラインはすべて同じであるため、明示的に初期化したコマンドラインと繰り返しを通じて初期化したコマンドラインには違いがあると結論付けることができますが、EXCLUDE_ITEMSそれが何かはわかりません。

実行時に後者が実際に除外されるようにEXCLUDEプロジェクトを初期化する方法EXCLUDE_ITEMS

rsync -a $EXCLUDES / /some/target

PS:実際には、私が実行したら

eval "rsync -a $EXCLUDES / /some/target"

...上記のループベースの方法の1つで初期化されている場合、ここで指定されたディレクトリはEXCLUDES実際には必要に応じて除外されます。forEXCLUDES

ベストアンサー1

問題は、を作成すると、"--exclude='$item'"除外パターンに一重引用符を追加することです。したがって、背後を除いて、'/foo'名前が一重引用符で始まり、終わるファイルはありません。

あなたは書く必要があります

EXCLUDES+=( "--exclude=$item" )

またはzshなので、二重引用符は必要ありません。ただ書いてください。

EXCLUDES+=( --exclude=$item )

またはzshなので、ループは必要ありません。^パラメータ拡張オプション:

rsync -a --exclude=$^EXCLUDE_ITEMS …

kshまたはbashではループと二重引用符が必要です。

EXCLUDES=()
for item in "${EXCLUDE_ITEMS[@]}";  do
  EXCLUDES+=( "--exclude=$item" )
done
rsync -a "${EXCLUDES[@]}" …

おすすめ記事