Bash での変数展開の落とし穴
2013/11/7
変数を使った grep の何気ないコード。
filter='"^ abc"'
echo " abc" | grep -e $filter
何事も無く、abc
と出力されるかとおもいきや何も出力されない。
さっきこれにハマった。
このスクリプトの二行目、$filter
を展開するとecho " abc" | grep -e "^ abc"
となるように見える。
だから grep の引数には^ abc
が渡されているはず、と思い込んでいたのだが実は違うらしい。
実際は"^
とabc"
が渡されている(もちろん-e
も)。
シェルがダブルクォーテーションを処理していない。
他にもバックスラッシュや(恐らく)ワイルドカードなども処理されない。
なんなんだーと思うけど、ダブルクォーテーションやバックスラッシュの処理は
変数展開の前に行うのだろうと推測。
素直にeval
使いましょう。