Motivo per ksh obsoleting -eq


8

L'ultima versione di ksh obsoletes utilizza -eqall'interno dei [[ ]]blocchi, preferendo (( ))invece. Perchè è questo? Non riesco a trovare alcuna documentazione sui vantaggi di (( ))sopra [[ ]]ovunque, e trovo che la sintassi molto più evidente.

Per esempio:

#!/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 ((...))

Risposte:


8

Se fate

$ ksh -n 'if [[ 1 -eq 1 ]]; then echo hi; fi'

ricevi il messaggio

ksh: warning: line 1: -eq within [[...]] obsolete, use ((...))

come hai visto. Ora prova questo:

$ ksh -n 'if (( 1 -eq 1 )); then echo hi; fi'
ksh:  1 -eq 1 : arithmetic syntax error

Questo funziona:

$ ksh -n 'if (( 1 == 1 )); then echo hi; fi'

Ricorda che il primo messaggio è solo un avvertimento. Puoi continuare a usare quel modulo. Dubito che verrà rimosso dal momento che romperebbe troppi script esistenti. A proposito, questo è accettato senza preavviso:

$ ksh -n 'if [ 1 -eq 1 ]; then echo hi; fi'

Uno dei motivi principali che la doppia parentesi è preferito è che gli operatori di confronto sono il più familiare <, <=, ==, ecc, (almeno rispetto ad altre lingue).

Le doppie parentesi funzionano anche in Bash e zsh. Una forma correlata, una sottostazione aritmetica, funziona in tutte, oltre a quella specificata da POSIX.

$ a=$((3 * 4))

Anche Korn, Bash e Z possono farlo in questo modo:

$ (( a = 3 * 4 ))

Anche se Dash, come esempio di shell POSIX, non supporta il confronto tra doppie parentesi nel modulo if (( ... )), puoi comunque eseguirle usando la sostituzione aritmetica, ma il risultato è l'opposto di quello che ti aspetteresti (questo vale anche per gli altri).

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.