bashで文字列比較演算子を書くことが少なく、少し悩んだので備忘録。
概要
bashでは文字列比較演算子を『==』でも『=』でもどっちにしても、以下のように実行可能である。
if [ ${env_prac} == "demo" ]; then
echo "Valid environment"
fi
if [ ${env_prac} = "demo" ]; then
echo "Valid environment"
fi
これってどっちが推奨されているのか?
POSIX準拠とBash拡張
文字列比較は、POSIX準拠とBash拡張で固有の記法になっているものがあるらしい。
POSIX準拠:
[ "$var" = "value" ]
Bash固有:
[[ "$var" == "value" ]]
[[ ... ]]
はBashで導入された新しい構文で、より強力で安全な条件式を提供する。
これでは=, ==どっちでも利用可能らしい。
しかし[ ... ]
はPOSIX仕様として標準化されているもの。
POSIX仕様の、[ ... ]
において==は定義されていない。
POSIX標準には=のみがサポートされている。
ただ、基本的に[ ... ]
でも==が使えたりする。これはBashの拡張機能によるもので、POSIX準拠シェルでは未定義の動作になることがあるとか。
結論
- POSIX準拠シェルでは文字列比較には
=
を使う。 ==
は Bash 拡張であり、POSIX標準には含まれていないため、動作しないケースもある。
参考