De façon similaire à la commande let, la construction ((...)) permet une évaluation arithmétique. Dans sa forme la plus simple, a=$(( 5 + 3 )), exécutera le calcul 5 + 3, soit 8, et attribuera sa valeur à la variable a. Néanmoins, cette construction en double parenthèse est aussi un mécanisme permettant la manipulation de variables à la manière du C dans Bash, par exemple (( var++ )).
Exemple 9.33. Manipulation, à la façon du C, de variables
#!/bin/bash # Manipuler une variable, style C, en utilisant la construction ((...)). echo (( a = 23 )) # Initialiser une valeur, style C, avec des espaces des deux # côtés 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 construction ((...)). # Elles fonctionnent seulement avec Bash, version 2.04 ou ultérieure. exit 0
Voir aussi l'Exemple 10.12, « Une boucle for à la C » et Exemple 8.4, « Représentation des constantes numériques ».