Let
| Fiche express | |
|---|---|
| Domaine | Arithmétique bash (builtin) |
| Commande | let
|
| Contexte | Évaluation/affectation d'expressions entières — la syntaxe $(( ))/(( )) est aujourd'hui préférée pour les tests et substitutions
|
| Voir aussi | Test, Printf |
let est un builtin bash qui évalue une expression arithmétique (entiers uniquement) et
peut l'utiliser pour affecter une variable. C'est l'ancêtre de la syntaxe (( ))/
$(( )), aujourd'hui plus répandue pour les mêmes usages, mais let
reste présent dans beaucoup de scripts existants et pratique pour une affectation rapide.
Syntaxe de base
let var=2+3 # affectation avec expression arithmétique
echo "$var" # 5
let "var += 1" # les guillemets sont nécessaires dès qu'il y a des espaces ou des opérateurs spéciaux
let "var *= 4"
Pré/post-incrémentation
let "--var" # pré-décrémentation : var est décrémentée avant d'être utilisée
let "++var" # pré-incrémentation
let "var++" # post-incrémentation : var est utilisée avant d'être incrémentée
let "var--" # post-décrémentation
La distinction pré/post compte surtout quand l'expression est testée dans la même instruction (voir plus bas).
Comparaison avec (( )) et $(( ))
La syntaxe (( ))/$(( )) fait le même travail que let sans avoir besoin de guillemets autour des expressions contenant des espaces ou des opérateurs, et c'est elle qui est recommandée aujourd'hui :
(( var == 2**3 )) # test arithmétique (statut de sortie), équivalent conditionnel de let
echo $(( 9 / 4 )) # substitution arithmétique, pour récupérer une valeur (division entière : 2)
(( i = 0 ))
(( i++ > 2 )) # i est comparé à 2 avant d'être incrémenté (post-incrémentation)
En résumé : (( )) pour un test/une instruction, $(( )) pour récupérer une valeur, let reste une alternative valide mais plus ancienne pour l'affectation.
Formater un résultat numérique
L'arithmétique bash reste entière ; pour du formatage ou des calculs non entiers, on combine généralement avec printf ou bc :
nb_ligne=$(printf "%08d" "$NB_LIGNE") # zero-pad sur 8 chiffres, voir [[Printf]]
taux_recyclage=$(echo "$TAPE_RECYCLABLE / $TAPE_TOTAL * 100" | bc -l | cut -d'.' -f1)
Éviter la surcharge d'un builtin
Si une commande interne comme echo a été redéfinie ou aliasée, le préfixe builtin force l'appel à la version native de bash :
for ((i = 0; i < 100; i++)); do
builtin echo $((2 * i + 1)) # force le builtin bash, ignore un alias/une fonction echo
done
seq 1 2 99 # équivalent plus direct via la commande externe seq