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