これを考慮すると:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}
echoは期待どおりにPARMS文字列を表示し、エラーを表示しませんが、rsyncは+ =追加オプションが存在しないかのように自動的に実行されます。しかし、これは期待どおりに機能します。
PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}
私はbash引用符で何かを混乱させていると思いますが(常に問題がある)文字列が正しく書かれているように見えますが、オプションが何となぜ無視されているのかわかりません。
答え1
2つの間には次の違いがあります。
PARMS+="... --exclude='.git'"
そして
... --exclude='.git'
まず、一重引用符自体が内部引用符です。だから彼らは存在しますrsync
引数として提供された代替テキストから。rsync
値を持つパラメータを取得します--exclude='.git'
。 2番目の一重引用符は、作成時にシェルによって解釈されます。いいえ内部引用符自体をrsync
表示できます--exclude=.git
。
この場合、一重引用符はまったく必要ありません。.git
特殊文字なしでそれ自体で完全に有効なシェルワードなので、コマンドで文字通り使用できます。
しかし、この種の仕事には良いです。大量に:
PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"
これにより、コマンドは別の単語で構成され、配列行を作成するときに解釈したい参照が何でも使用されます。"${PARMS[@]}"
拡大する引数自体に特殊文字やスペースが含まれていても、配列内の各項目を別々の引数として扱うので、意図したとおりに作成したことを確認rsync
してください。
答え2
また@マイケルホーマーの答え、あなたはそれを使用することができますbash
評価機能:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo "$PARMS"
eval "rsync ${PARMS} . "'"${TARGET}"'