コードベースでリテラル文字列 " $$
" を確認したいのですが、次のようにドル記号をエスケープします。
ack \$\$
動作しません。
シェルの引用に混乱しています。次のように入力します。
ack "\\\$\\\$\("
シェルは二重引用符で囲まれた文字列を補間して、それ\\
が に変換され\
、\$
が に変換され$
、\(
が に変換され\(
、 ack がその文字列\$\$\(
を引数として取得します。一重引用符を使用してシェル補間を回避し、呼び出す方がはるかに簡単です。
ack '\$\$\('
に置き換えack
てecho
、シェルが文字列を展開する方法を調べます。ご了承ください
ack "\\$\\$\("
も機能しますが、理由はわずかに異なります。ここでは、最初の 2 つ\
は単一の (エスケープされた) として扱われ、変数名で有効な文字ではない文字が後に続くため、 \
は$
として変換されます。は補間の対象ではないため、エスケープする必要がないという理由だけで代わりに展開されます。ただし、二重引用符の外側は に変換されることに注意してください。$
\(
\(
(
(
\(
(
シェルの引用ルールは時々混乱します!
ack を使用-Q
してエスケープします。
ack -Q '$$'
次のように、3 つのバックスラッシュでドル記号をエスケープできます。
ack "\\\$\\\$"
または、一度だけエスケープする必要がある単一引用符を使用します。
ack '\$\$'
フォーマット指定子printf
を使用して、引用を処理するために使用できます。%q
$ printf %q '$$('
\$\$\(
help print
言いたいことは次のとおりです(ここではbashを想定しています)`
%q quote the argument in a way that can be reused as shell input