二重引用符はあなたを捨てています。これにより、シェルはメタ文字を展開できます。一重引用符のみを使用した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$bci をエスケープしたかどうかに関係なく、リテラル文字列が見つかりました$。
二重引用符で試してみました:
$ grep "abc\$" <<<'abc$'
$ grep "abc\\$" <<<'abc$'
abc$
シングルは、行末アンカーとして を\エスケープしました。$2 つ前に置くと、シェル以外のメタ文字および正規表現リテラルとして\\エスケープされます。$