| Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
|---|---|---|
| Indietro | Capitolo 9. Variabili riviste | Avanti |
Simile al comando let, il costrutto ((...)) consente l'espansione e la valutazione aritmetica. Nella sua forma più semplice, a=$(( 5 + 3 )) imposta "a" al valore "5 + 3", cioè 8. Non solo, ma questo costrutto consente di gestire, in Bash, le variabili con la sintassi del linguaggio C.
Esempio 9-31. Gestire le variabili in stile C
#!/bin/bash
# Manipolare una variabile, in stile C, usando il costrutto ((...)).
echo
(( a = 23 )) # Impostazione, in stile C, con gli spazi da entrambi i lati
#+ dell' "=".
echo "a (valore iniziale) = $a"
(( a++ )) # Post-incremento di 'a', stile C.
echo "a (dopo a++) = $a"
(( a-- )) # Post-decremento di 'a', stile C.
echo "a (dopo a--) = $a"
(( ++a )) # Pre-incremento di 'a', stile C.
echo "a (dopo ++a) = $a"
(( --a )) # Pre-decremento di 'a', stile C.
echo "a (dopo --a) = $a"
echo
###########################################################################
# Fate attenzione che, come nel C, gli operatoti di pre- e post-decremento
#+ hanno effetti collaterali leggermente differenti.
n=1; let --n && echo "Vero" || echo "Falso" # Falso
n=1; let n-- && echo "Vero" || echo "Falso" # Vero
# Grazie, Jeroen Domburg.
###########################################################################
echo
(( t = a<45?7:11 )) # Operatore ternario del C.
echo "Se a < 45, allora t = 7, altrimenti t = 11."
echo "t = $t " # Si!
echo
# ---------------------
# Attenzione, sorpresa!
# ---------------------
# Evidentemente Chet Ramey ha contrabbandato un mucchio di costrutti in
#+ stile C, non documentati, in Bash (in realtà adattati da ksh, in
#+ quantità notevole).
# Nella documentazione Bash, Ramey chiama ((...)) matematica di shell,
#+ ma ciò va ben oltre l'aritmetica.
# Mi spiace, Chet, ora il segreto è svelato.
# Vedi anche l'uso del costrutto ((...)) nei cicli "for" e "while".
# Questo costrutto funziona solo nella versione 2.04 e successive, di Bash.
exit 0 |
Vedi anche Esempio 10-12 e Esempio 8-4.