Expr

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Calculs entiers en ligne de commande
Commande expr
Limite Entiers uniquement, pas de décimaux
Voir aussi Bc (calcul flottant)

expr évalue une expression arithmétique (ou textuelle) passée en argument et affiche le résultat sur la sortie standard. C'est un utilitaire historique, disponible sur à peu près tous les systèmes Unix/Linux, pratique dans un script shell qui doit rester portable — mais limité aux nombres entiers et largement supplanté aujourd'hui par la syntaxe arithmétique native de bash.

Opérateurs de base

expr 5 + 3     # 8
expr 5 - 3     # 2
expr 5 \* 3    # 15  (astérisque échappé, voir plus bas)
expr 5 / 3     # 1   (division entière)
expr 5 % 3     # 2   (reste de la division)

Chaque opérande et chaque opérateur doivent être des arguments séparés par des espaces (expr 5+3 ne fonctionne pas, expr 5 + 3 oui).

Échapper l'astérisque

Le signe * est interprété par le shell comme un joker de globbing (expansion des noms de fichiers) avant même d'arriver à expr. Sans échappement, une commande comme expr 5 * 3 se retrouve remplacée par la liste des fichiers du répertoire courant si celui-ci n'est pas vide, avec un résultat imprévisible. Il faut donc échapper l'astérisque, soit avec un antislash, soit en le mettant entre guillemets :

expr 5 \* 3      # antislash
expr 5 "*" 3     # ou guillemets

Limite : uniquement des nombres entiers

expr ne sait pas manipuler de nombres à virgule. Une astuce classique pour simuler des décimales consiste à multiplier les opérandes par une puissance de 10 avant le calcul, puis à interpréter mentalement (ou via un traitement supplémentaire) le résultat avec le nombre de décimales voulu. Par exemple pour calculer 20 % de 80 avec deux décimales de précision, on travaille sur des valeurs multipliées par 100 :

expr 2000 \* 8000 / 10000    # équivalent de 20 * 80 / 100, avec 2 décimales de marge

Cette astuce reste limitée et peu lisible dès que les calculs se complexifient — pour du calcul flottant réel, voir Bc.

Alternative moderne : l'arithmétique bash

Depuis longtemps, bash propose une syntaxe d'évaluation arithmétique native, $(( )), plus simple à écrire et à lire qu'un appel à expr : pas besoin de lancer un processus externe, pas besoin d'échapper l'astérisque (on est dans une syntaxe dédiée, pas dans le shell classique), et les opérateurs se combinent naturellement :

echo $((5 + 3))       # 8
echo $((5 * 3))       # 15, pas d'échappement nécessaire
echo $((5 / 3))       # 1
echo $((5 % 3))       # 2
resultat=$((20 * 80 / 100))
echo "$resultat"      # 16

$(( )) reste toutefois lui aussi limité aux entiers (c'est de l'arithmétique bash, pas du flottant) — pour de vrais calculs décimaux en shell, direction Bc.

Voir aussi

  • Bc — calcul flottant en ligne de commande, complémentaire d'expr pour les nombres décimaux