Razão para o ksh obsoleto -eq

8

A versão mais recente do ksh obsoleta usando blocos -eqdentro [[ ]], preferindo (( )). Por que é isso? Não consigo encontrar qualquer documentação sobre as vantagens de (( ))mais de [[ ]]qualquer lugar, e eu acho que a sintaxe consideravelmente mais óbvio.

Por exemplo:

#!/bin/ksh
var=1
if [[ $var -eq 1 ]]
then
  echo ALPHA
fi

[adam@hendrix test]$ ksh -n test.sh
test.sh: warning: line 3: -eq within [[...]] obsolete, use ((...))
eu e
fonte

Respostas:

8

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
Pausado até novo aviso.
fonte