[
] является встроенной командой оболочки в bash и zsh:
$ type [
[ is a shell builtin
Из документации Встроенные команды оболочки:
Встроенные команды содержатся в самой оболочке. Когда имя встроенной команды используется в качестве первого слова простой команды (см. Простые команды), оболочка выполняет команду напрямую, не вызывая другую программу. Встроенные команды необходимы для реализации функциональности, которую невозможно или неудобно получить с помощью отдельных утилит.
Официальная документация ($ help test
) разрешает использовать только =
:
STRING1 = STRING2
Истинно, если строки равны.
Таким образом, правильным выражением будет:
$ [ "a" = "a" ] && echo yes
yes
Что происходит, так это то, что bash немного менее строг. Поддержка оператора ==
с помощью [
кажется расширением bash, и использовать его не рекомендуется:
string1 == string2
string1 = string2
Истинно, если строки равны. При использовании с командой [[ выполняет сопоставление с образцом, как описано выше (см. Условные конструкции).
'=' следует использовать с командой test для соответствия POSIX.
Если вы хотите использовать ==
, вам следует использовать ключевое слово [[
:
$ [[ "a" == "a" ]] && echo yes
yes
Имейте в виду, что [[[
менее переносимо (не является POSIX). Но и bash, и zsh поддерживают его.