De même que la commande let, la syntaxe ((...)) permet l'évaluation arithmétique. Sous sa forme la plus simple, a=$(( 5 + 3 )) affecterait à la variable a le résultat du calcul 5 + 3, ou 8. Mais cette syntaxe à doubles parenthèses est également un mécanisme permettant la manipulation de variables à la manière du C dans Bash, comme par exemple (( var++ )).
Exemple 8.5. Manipulation de variables à la manière de C.
#!/bin/bash
# Manipuler une variable, comme en C, avec la syntaxe ((...)).
echo
(( a = 23 )) # Initialise une valeur, style C, avec un espace
#+ de chaque côté du signe "=".
echo "a (valeur initiale) = $a"
(( a++ )) # Post-incrémente 'a', style C.
echo "a (après a++) = $a"
(( a-- )) # Post-décrémente 'a', style C.
echo "a (après a--) = $a"
(( ++a )) # Pre-incrémente 'a', style C.
echo "a (après ++a) = $a"
(( --a )) # Pre-décrémente 'a', style C.
echo "a (après --a) = $a"
echo
#####################################################################
# Notez que, comme en C, les opérateurs pré- et post-décrémentation
#+ ont des effets de bord légèrement différents.
n=1; let --n && echo "True" || echo "False" # Faux
n=1; let n-- && echo "True" || echo "False" # Vrai
# Merci, Jeroen Domburg.
#####################################################################
echo
(( t = a<45?7:11 )) # opérateur à trois opérandes, style C.
# ^ ^ ^
echo "If a < 45, then t = 7, else t = 11."
echo "t = $t " # Oui!
echo
# ------------------
# Alerte Easter Egg!
# ------------------
# Chet Ramey semble avoir laissé un ensemble de constructions C non
#+ documentées dans Bash (déjà adapté de ksh).
# Dans les documents Bash, Ramey appelle ((...)) un shell arithmétique,
#+ mais cela va bien au-delà.
# Désolé, Chet, le secret est maintenant découvert.
# Voir aussi les boucles "for" et "while" utilisant la syntaxe ((...)).
# Elles fonctionnent seulement avec Bash, version 2.04 ou ultérieure.
exit 0
Voir aussi l'Exemple 11.12, « Une boucle for comme en C » et Exemple 8.4, « Représentation des constantes numériques ».