Se você fizer
$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'
você recebe a mensagem
ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))
como você viu. Agora tente o seguinte:
$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh: 1 -eq 1 : arithmetic syntax error
Isso funciona:
$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'
Lembre-se de que a primeira mensagem é apenas um aviso. Você pode continuar usando esse formulário. Duvido que ele seja removido, pois quebraria muitos scripts existentes. A propósito, isso é aceito sem aviso:
$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'
Uma das principais razões que os parênteses duplos é o preferido é que os operadores de comparação são os mais familiar <
, <=
, ==
, etc., (pelo menos, quando comparado com outros idiomas).
Parênteses duplos também funcionam no Bash e no zsh. Uma forma relacionada, subestação aritmética, funciona em todas elas, além de ser especificada pelo POSIX.
$ a=$((3 * 4))
Korn, Bash e Z também podem fazer o seguinte:
$ (( a = 3 * 4 ))
Embora o Dash, como um exemplo de shell POSIX, não suporte comparações de parênteses duplos no formulário if (( ... ))
, você ainda pode fazê-las usando substituição aritmética, mas o resultado é o oposto do que você esperaria (isso também é válido para os outros).
$ echo $(( 1 == 1 )); (( 1 == 1 )); echo $? # in Dash, use true instead of the second statement
1
0
$ echo $(( 1 == 2 )); (( 1 == 2 )); echo $? # in Dash, use false instead of the second statement
0
1