9.7. Il costrutto doppie parentesi

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.