二重引用符はあなたを捨てています。これにより、シェルはメタ文字を展開できます。一重引用符のみを使用したLinuxボックスで:
$ grep 'abc$' <<<'abc$'
$ grep 'abc\$' <<<'abc$'
$ grep 'abc\$' <<<"abc$"
abc$
$ grep 'abc$' <<<'abc$'
$ grep 'abc\\$' <<<'abc$'
$
上記grep
の 5 つのコマンドのうち、パターンを検出 (および出力) したのはabc\$
. をエスケープしなかった場合、行末に固定され$
た文字列を探していると見なされます。abc
の前にバックスラッシュを 1 つ置くと、 は行末アンカーとしてではなく、リテラル文字として$
認識されました。$
$
行末アンカーとしての には、ある程度の知性があることに注意してください。$
を正規表現の途中に置くと、正規の文字になります。
$ grep 'a$bc' <<<'a$bc'
a$bc
$ grep 'a\$bc' <<<'a$bc'
a$bc
ここでは、a$bc
i をエスケープしたかどうかに関係なく、リテラル文字列が見つかりました$
。
二重引用符で試してみました:
$ grep "abc\$" <<<'abc$'
$ grep "abc\\$" <<<'abc$'
abc$
シングルは、行末アンカーとして を\
エスケープしました。$
2 つ前に置くと、シェル以外のメタ文字および正規表現リテラルとして\\
エスケープされます。$