コマンドで引用符を含むBash変数(文字列)を使用するにはどうすればよいですか?


回答:


55

簡単な答え:BashFAQ#50(「コマンドを変数に入れようとしていますが、複雑なケースは常に失敗します!」)を参照してください。

長い答え:コマンド(またはコマンドの一部)を変数に入れてからそのまま戻すことは複雑です。シェルがコマンドラインで変数を展開するときに、変数が二重引用符で囲まれている場合、解析されません。引用符で囲まれていない場合、その中のスペースは引数ブレークとして解析されますが、引用符とエスケープは解析されません。どちらの場合でも、変数の値に引用符を付けても何の役にも立ちません。

通常、この種のことを行う最良の方法は、単純なテキスト変数の代わりに配列を使用することです。

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

神聖なジェザスが機能します!
Slawomir


-2

問題は見当たりません。

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

値を再度引用する必要があるかもしれません:

$ rsync "$FLAGS" dir1 dir2

5
echoあなたがそれが何であると思うかを示していません。試してみてくださいprintargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"、なぜどちらも、これらのオプションの作業を見ていないし。
ゴードンデイヴィソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.