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