RM-BLOG

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【UNIX】変数文字列を扱う時のシングルクォーテーション有無について

正直個人的にあんまり区別つけずに使っていたがなんとなくわかってきたので備忘的にメモ

UNIXで適当な環境変数「var」を用意してそいつを使う場合、

var="aaa"

echo $var	←①
echo '$var'	←②



としたとき、①と②は結果が違う。

$ aaa	←①
$ $var	←②



ってなる。
つまり②は評価してほしい変数の中身ではなく評価式(っていうの?よくしらんが)がそのまま出る。
シングルクォーテーションで囲うと、中に変数を書こうが、書かれた文字列をそのまま扱うという動きをするのだ。
(今さらながら思い知った)


 

 
これはgrepで条件に使うときに気付いたのだが
例えばあるディレクトリ「test」配下に「aaa.txt」「bbb.txt」「ccc.txt」の3ファイルがあるとき、
変数「var」に"aaa"を代入した後、この変数「var」を条件にしてgrepかけるとする↓

$ var="aaa"
$ 
$ ls ./test | grep $var | wc -l
1	←上でいう①のパターン、これはひっかかるので件数が1になる



一方、grep条件に指定するときシングルクォーテーションで囲ってしまうと


$ var="aaa" $ $ ls ./test | grep '$var' | wc -l 0 ←上でいう②のパターン、ひっかからないので件数は0になる



つまり、②のパターンでgrepしかけるときは、実際には

ls ./test | grep $var


という動きをしているので、ひっかかるわけがないということ。("$var"という文字列でひっかけてる)



実際は

if [ `ls ./test | grep '$var' | wc -l` -gt 0 ]; then
	…
fi


みたいなロジック組んでて(つまりあるディレクトリ配下に目当てのサブディレクトリがいるかを件数とって調べる判定ロジック組んでて)、
それがどー頑張っても0しか返さねえなと思ったらこうゆう理屈だった。
この場合は

if [ `ls ./test | grep $var | wc -l` -gt 0 ]; then
	…
fi



にしなきゃいけなかったという個人的な一つの学習である。

もっとスマートなやり方ありそうなもんだけどな…。
存在しないディレクトリをlsやfindで指定すると標準エラー出力が出るから、こういう判定ロジック組む時にはシェルスクリプトには組み込みづらく、
個人的にはこの判定ロジックが一番重宝しているのだが。
まあこの例にさえ気を付けていれば大体問題はなさそうだからこの後も使っていこう。