Motivo do ksh obsoleto -eq

8

A versão mais recente do ksh se torna obsoleta usando -eq dentro de [[ ]] blocks, preferindo (( )) . Por que é isso? Não consigo encontrar nenhuma documentação sobre as vantagens de (( )) over [[ ]] em qualquer lugar, e acho essa sintaxe consideravelmente mais óbvia.

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 ((...))
    
por me_and 25.11.2010 / 12:26

1 resposta

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 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
    
por 25.11.2010 / 15:57