5

コードベースでリテラル文字列 " $$" を確認したいのですが、次のようにドル記号をエスケープします。

ack \$\$

動作しません。

4

4 に答える 4

16

シェルの引用に混乱しています。次のように入力します。

ack "\\\$\\\$\("

シェルは二重引用符で囲まれた文字列を補間して、それ\\が に変換され\\$が に変換され$\(が に変換され\(、 ack がその文字列\$\$\(を引数として取得します。一重引用符を使用してシェル補間を回避し、呼び出す方がはるかに簡単です。

ack '\$\$\('

に置き換えackecho、シェルが文字列を展開する方法を調べます。ご了承ください

ack "\\$\\$\("

も機能しますが、理由はわずかに異なります。ここでは、最初の 2 つ\は単一の (エスケープされた) として扱われ、変数名で有効な文字ではない文字が後に続くため、 \$として変換されます。は補間の対象ではないため、エスケープする必要がないという理由だけで代わりに展開されます。ただし、二重引用符の外側は に変換されることに注意してください。$\(\(((\((

シェルの引用ルールは時々混乱します!

于 2013-02-21T20:47:47.860 に答える
16

ack を使用-Qしてエスケープします。

ack -Q '$$'
于 2013-05-16T17:22:31.140 に答える
0

次のように、3 つのバックスラッシュでドル記号をエスケープできます。

ack "\\\$\\\$"

または、一度だけエスケープする必要がある単一引用符を使用します。

ack '\$\$'
于 2013-02-21T20:27:49.003 に答える
0

フォーマット指定子printfを使用して、引用を処理するために使用できます。%q

$ printf %q '$$('
\$\$\(

help print言いたいことは次のとおりです(ここではbashを想定しています)`

 %q quote the argument in a way that can be reused as shell input
于 2013-02-21T20:54:25.937 に答える