test
(ou [ ... ]
) só sabe quem tem um único sinal de igual:
s1 = s2
True if the strings s1 and s2 are identical; otherwise, false.
Mas Bash aceita o duplo sinal de igual também, embora a ajuda embutida não admita isso (o manual ):
$ help test | grep = -A1
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
Quanto aos outros shells, isso depende:
$ dash -c '[ x == x ] && echo foo'
dash: 1: [: x: unexpected operator
$ zsh -c '[ x == x ] && echo foo'
zsh:1: = not found
$ ksh93 -c '[ x == x ] && echo foo'
foo
zsh
é um pouco estranho aqui, ==
é considerado um operador especial, por isso deve ser citado:
$ zsh -c '[ x "==" x ] && echo foo'
foo
A utilidade externa test
/ [
do GNU coreutils no meu Debian suporta ==
(mas o manual não admite isso, o que o OS X não faz.
Portanto, com test
/ [ .. ]
, use =
, pois é mais amplamente suportado.
Com o [[ ... ]]
construct , ambos =
e ==
são iguais (pelo menos no Bash) e o lado direito do operador é tomado como um padrão, como em um arquivo glob, a menos que seja citado. (Nomes de arquivos não são expandidos dentro de [[ ... ]]
)
$ bash -c '[[ xxx == x* ]] && echo foo'
foo
Mas é claro que essa construção não é padrão:
$ dash -c '[[ xxx == x* ]] && echo foo'
dash: 1: [[: not found