Kohara's Blog

KoharaKazuya
職業はプログラマーです。趣味がプログラミングです。Web 技術が好きで、中でもフロントエンドの JS, HTML, CSS が好きです。得意なのは TypeScript, CSS, AWS, シェル芸です。

Bash での変数展開の落とし穴

変数を使った grep の何気ないコード。

filter='"^ abc"'
echo " abc" | grep -e $filter

何事も無く、abcと出力されるかとおもいきや何も出力されない。 さっきこれにハマった。

このスクリプトの二行目、$filterを展開するとecho " abc" | grep -e "^ abc"となるように見える。 だから grep の引数には^ abcが渡されているはず、と思い込んでいたのだが実は違うらしい。 実際は"^abc"が渡されている(もちろん-eも)。 シェルがダブルクォーテーションを処理していない。 他にもバックスラッシュや(恐らく)ワイルドカードなども処理されない。

なんなんだーと思うけど、ダブルクォーテーションやバックスラッシュの処理は 変数展開の前に行うのだろうと推測。

素直にeval使いましょう。