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 isto:
$ 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. Eu duvido que ele seja removido, já que ele quebraria muitos scripts existentes. By the way, isso é aceito sem um aviso:
$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'
Um dos principais principais motivos entre parênteses preferidos é que os operadores de comparação sejam os mais familiares <
, <=
, ==
, etc. (pelo menos quando comparado a outros idiomas).
Os parênteses duplos também funcionam no Bash e no zsh. Uma forma relacionada, subestimação aritmética, funciona em todos eles, além de ser especificada por POSIX.
$ a=$((3 * 4))
Korn, Bash e Z também podem fazer assim:
$ (( a = 3 * 4 ))
Embora Dash, como um exemplo de shell POSIX, não suporte comparações entre parênteses duplos no formato if (( ... ))
, você ainda pode fazê-las usando a substituição aritmética, mas o resultado é o oposto do que você esperaria (isso também é verdade 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