Gli operandi dei confronti numerici -eq
, -gt
, -lt
, -ge
, -le
e -ne
sono presi come espressioni aritmetiche. Con qualche limitazione, devono ancora essere parole singole shell.
Il comportamento dei nomi delle variabili nell'espressione aritmetica è descritto in Shell Arithmetic :
Le variabili shell sono consentite come operandi; l'espansione dei parametri viene eseguita prima della valutazione dell'espressione. All'interno di un'espressione, le variabili di shell possono anche essere referenziate per nome senza usare la sintassi di espansione dei parametri. Una variabile di shell che è nulla o non impostata viene valutata su 0 quando viene referenziata per nome senza utilizzare la sintassi di espansione del parametro.
e anche:
Il valore di una variabile viene valutato come espressione aritmetica quando viene referenziato
Ma in realtà non riesco a trovare la parte della documentazione in cui si dice che i confronti numerici assumano espressioni aritmetiche. Non è descritto in Costrutti condizionali sotto [[
, né è descritto in Espressioni condizionali di Bash .
Ma, per esperimento, sembra funzionare come detto sopra.
Quindi, cose come questa funzionano:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
anche questo (viene valutato il valore della variabile):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Ma questo no; non è una singola parola shell quando [[ .. ]]
viene analizzato, quindi c'è un errore di sintassi nel condizionale:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
In altri contesti aritmetici, non è necessario che l'espressione sia senza spazi bianchi. Questo stampa 999
, poiché le parentesi delimitano in modo inequivocabile l'espressione aritmetica nell'indice:
a[6]=999; echo ${a[1 + 2 + 3]}
D'altra parte, il =
confronto è una corrispondenza del modello e non coinvolge l'aritmetica, né l'espansione automatica variabile effettuata in un contesto aritmetico (costrutti condizionali):
Quando vengono utilizzati gli operatori ==
e !=
, la stringa a destra dell'operatore viene considerata un modello e abbinata secondo le regole descritte di seguito in Pattern Matching, come se l'opzione shell extglob fosse abilitata. L' =
operatore è identico a ==
.
Quindi questo è falso poiché le stringhe sono ovviamente diverse:
[[ "1 + 2 + 3" = 6 ]]
così com'è, anche se i valori numerici sono gli stessi:
[[ 6 = 06 ]]
e anche qui le stringhe ( x
e 6
) vengono confrontate, sono diverse:
x=6
[[ x = 6 ]]
Questo espanderebbe la variabile, tuttavia, quindi questo è vero:
x=6
[[ $x = 6 ]]
x=1
segui[[ x -gt 2]]
?