$はbashでは環境変数の展開に使われる
$の後の文字が空白文字だったり行末だったりで展開することがなければ$のままになる
- bashで
$の変数展開をやめさせければ\でクォートする
- bashで
\によるクォートをやめさせたければ\とする
- 正規表現で
$は行末に長さ0でマッチする
- '$'という文字にマッチさせる正規表現は
$
plain
1export GREP_OPTIONS='--color=always'
2C=love
環境変数Cをセットしておきましょう。
plain
1echo I love C$C | grep $C
の結果は
I love Clove
です。(強調表示部分がカラー表示です。以下同様)
$Cが文字列ioveに展開されているのが分かりますね。echo I love Clove | grep loveを実行したのと同じことなのです。
質問で
するとI love $が出るのは"$の後続がアルファベットじゃないから環境変数として正しくない"ため$自身がでています。
環境変数の展開を明示的に止めたい時はどうするかというと、\でエスケープします。
plain
1echo I love C$S | grep $
とすると結果は
I love C$S
です。強調表示がありません。
にも関わらずI love C$Sが表示されていることに気をつけてください。(echo hoge | grep hugaでは結果が出ないことを確認してください)
ということはこの行はマッチしているのです。
$ が行末にマッチする正規表現なので、行末に長さ0でマッチしているのです。
だからマッチしていてかつ強調表示がないという結果になるのです。
plain
1echo I love C$C | grep e$
すると結果は
I love Clove
です。
e$ が "eの直後に行末" という意味になるので行末のeにしかマッチしていないことを確認してください。
plain
1echo I love C$C | grep e
の結果が
I love Clove
なのと見比べてください。
正規表現で$という文字自身を検索したい時は$という正規表現を渡さなければなりません。
bashで$と書くと\記号の作用で変数展開をやめて$という文字自身になります。
\は渡りません。
\を渡したければ\と書きます。
の結果が
$C
で($の変数展開する機能が\で抑止されている)
の結果が
\love
で(\の「$の変数展開を抑止する機能」がもう1つの\で抑止されている。$は変数展開の機能を持つ)
の結果が
$C
なことを確認してください。
(\の「$の変数展開を抑止する機能」がもう1つの\で抑止されている。$の変数展開する機能が\で抑止されている)
以上から質問でやりたいことをキッチリ書くなら
plain
1echo I love $ | grep \$
とします。
こうするとechoはI love $という文字列を出力して、grepは第1引数に$を取ります。
これで文字列中の$にマッチして
I love $
という結果を得ます。