件名が結論。
以下実験です。
まずはbashで以下を実行。
$ [ a = b ] && echo true || echo false
false
$ [ a == a ] && echo true || echo false
true
同じコマンドをdashで実行。
$ [ a = b ] && echo true || echo false
false
$ [ a == a ] && echo true || echo false
[: 4: a: unexpected operator
false
zshでもdashと同様の結果になりました。
おそらく、bashというシェルスクリプトの処理系が、if文やtest文の==を=とみなしてくれているだけなのでしょう。
求) シェルスクリプトの言語仕様の一次ソース
見つからないよー
(追記)
コメントでのご指摘を受けたりさらに調べたりしたまとめ。
- シェルスクリプトの仕様については、POSIXの通り。
- == は独自拡張なので、bash, ksh, csh などでは使える。
- checkbashisms コマンドでチェックできて便利そう
また、
http://mywiki.wooledge.org/Bashism
に、bash->dashへの移植の際、よくある仕様の違いについて記述されている模様。