9.7. La construction en double parenthèse

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 ».