パラメータリストを作成するためのBash文字列の連結

パラメータリストを作成するためのBash文字列の連結

これを考慮すると:

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してください。

おすすめ記事