等号と中括弧を含む変数の拡張

等号と中括弧を含む変数の拡張

rsyncを使用し、特定の設定に従ってファイルを除外するスクリプトを作成しています。形式の除外フラグで終わります--exclude={foo, bar, baz}

しかし、コマンドでそれを拡張しようとしたときにrsyncフラグがエスケープされていることがわかりました。 Bashデバッガでは、rsync $excludesComesコマンドがrsync '--exclude={foo,bar,baz}'期待どおりに機能しないことがわかります。一部のテストでは、拡張時に、、、または埋め込みrsync --exclude={foo,bar,baz}文字列が一重引用符で囲まれていることがわかりました。生成された文字列にevalを使用せずにこの問題を解決する方法はありますか?={}

答え1

引用時に中括弧拡張は発生しません。また、可能であれば、変数ではなく配列にパラメータを保存する必要があります。

私は次があなたに役立つと思います。

excludes=( $(--exclude={foo,bar,baz}) )
rsync "${excludes[@]}"

答え2

Bashデバッガでは、... =、{、または}を含むすべての文字列は、拡張時に一重引用符で囲まれます。

xtrace出力()を参照する場合は、set -x特殊文字を含む引数を一重引用符で囲んで表示するのが好きです。出力は、シェルへの入力として使用できる形式です。

しかし、これが引用符が文字列の一部であるという意味ではありません。

比較する:

$ echo abc def\ ghi
+ echo abc 'def ghi'
abc def ghi

$ echo abc \'def\ ghi\'
+ echo abc ''\''def ghi'\'''
abc 'def ghi'

私が知っている限り、等号を含む文字列を引用することは問題ではありません。

関連情報