Let

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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

Voir aussi

  • Test — expressions conditionnelles bash
  • Printf — formatage de sortie