シェルスクリプトの if 文が誤動作する原因

v=1
if [ $v=2 ]; then
echo "NG1"
else
echo "OK1"
fi

if [ $v -eq 2 ]; then
echo "NG2"
else
echo "OK2"
fi

このシェルスクリプトを実行すると、以下のように出力される。

NG1
OK2

誤動作する原因は

if [ $v=2 ]; then

if [ $v = 2 ]; then

となっていないため。

どうやら $v=2 と書くと、それが空白文字列ではないため、真として扱われてしまうようで、スペースを入れると、= が演算子として働くようだ。

if の [ と ] はスペースで空けなければならないということは知っていたが、演算子も空けなければならないということを、身をもって知った。