Expr
| 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