Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. expr, la commande d'évaluation d'expressions
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

expr, la commande d'évaluation d'expressions

Description 

expr est une commande d’évaluation d’expressions. Elle peut évaluer des expressions arithmétiques, des comparaisons numériques ou de chaînes de caractères, des opérations booléennes, des opérations sur des chaînes de caractères, et des comparaisons de chaînes de caractères avec des expressions régulières.

Elle est disponible depuis UNIX version 7 (Bell Labs).

L’augmentation des fonctionnalités des shells a rendu cette commande moins indispensable que dans les anciennes versions d’UNIX, mais elle fait partie des commandes de base que l’on peut encore rencontrer dans certains shell scripts, et il est bon de comprendre son fonctionnement pour ne pas faire d’erreurs d’interprétation.

Principe de fonctionnement 

1. Généralités 

La commande expr permet d’évaluer des expressions arithmétiques portant sur des entiers ou des booléens, des comparaisons d’entiers ou de chaînes de caractères, des manipulations de chaînes de caractères et des comparaisons de chaînes de caractères à des expressions régulières.

expr ne reconnaît que les arguments qui sont des éléments simples :

  • des nombres entiers,

  • des chaînes de caractères,

  • des opérateurs,

  • des fonctions intrinsèques de expr,

  • des parenthèses.

Chaque élément doit être passé à expr sous forme d’un argument séparé des autres.

Les expressions régulières reconnues par expr sont des expressions régulières basiques, c’est-à-dire celles que l’on peut utiliser par exemple avec ed ou grep.

Le résultat de la commande expr sera affiché sur la sortie standard (stdout), et la commande retournera un code retour (exit code) permettant éventuellement de tester le résultat de son exécution, avec pour résultats possibles :

  • 0 si la valeur de l’expression n’est ni vide, ni 0,

  • 1 si la valeur de l’expression est vide, ou 0,

  • 2 en cas d’erreur de syntaxe,

  • 3 si une erreur s’est produite.

2. Les parenthèses 

Les parenthèses permettent de grouper les expressions que expr doit évaluer, de la même façon qu’on peut les utiliser dans une expression mathématique. Comme elles ont une signification particulière pour le shell, et qu’elles doivent parvenir sans modification au programme expr, il faudra les faire précéder d’un antislash ou les encadrer entre des quotes, simples ou doubles, pour éviter leur traitement par le shell.

3. Les opérateurs...

Attention aux pièges 

1. Interprétation par le shell 

De nombreux caractères utilisés par la commande expr sont des métacaractères du shell et ont une signification particulière pour lui : <, >, |, *, (, ), &, =, :.

Certains doivent impérativement être précédés d’un antislash (\) ou placés entre quotes afin d’éviter leur interprétation par le shell. Cela alourdit la syntaxe, mais c’est malheureusement généralement indispensable.

2. Respect de la syntaxe 

Il faut également prendre garde à séparer les arguments passés à expr afin d’avoir une interprétation correcte de ceux-ci. En effet, la commande :

expr '2 * 3' 

par exemple, n’aura aucun sens pour expr contrairement à :

expr 2 '*' 3 

La commande args vue précédemment montre clairement la différence :

1. Premier cas

$ args expr '2 * 3'  
ARGC = 3  
ARGV[  1 : length =   4] = "expr"  
ARGV[  2 : length =   5] = "2 * 3" 

2. Deuxième cas

$ args expr 2 '*' 3  
ARGC = 5  
ARGV[  1 : length =   4] = "expr"  
ARGV[  2 : length =   1] = "2"  
ARGV[  3 : length =   1] = "*"  
ARGV[  4 : length =   1] = "3"...

Exercices 

1. Exercice 1 

Le but de cet exercice est de comprendre et de mémoriser la syntaxe de la commande de expr.

Combien d’arguments faut-il passer à la commande expr pour lui faire évaluer l’expression : (1 + 2) < 3 OU (4 * 5) > 17 ?

Solution

La commande à écrire sera la suivante :

expr \( 1 + 2 \) \< 3 '|' \( 4 \* 5 \) \> 17 

L’utilisation de la commande args (vue précédemment) nous permettra de visualiser et de compter les différents arguments :

$ args \( 1 + 2 \) \< 3 '|' \( 4 \* 5 \) \> 17  
ARGC = 16  
ARGV[  1 : length =   1] = "("  
ARGV[  2 : length =   1] = "1"  
ARGV[  3 : length =   1] = "+"  
ARGV[  4 : length =   1] = "2"  
ARGV[  5 : length =   1] = ")"  
ARGV[  6 : length =   1] = "<"  
ARGV[  7 : length =   1] = "3"  
ARGV[  8 : length =   1] = "|"  
ARGV[  9 : length =   1] = "("  
ARGV[ 10 : length =   1] = "4"  
ARGV[ 11 : length =   1] = "*"  
ARGV[ 12 : length =   1] = "5"  
ARGV[ 13 : length =   1] = ")"  
ARGV[ 14 : length =   1] = ">"  
ARGV[ 15 : length =   2] = "17" 

Le nombre...