Syntaxe :
expr chaine-de-caracteres : expression-reguliere-basique
La commande expr propose l'opérateur ":" qui permet de mettre en correspondance une chaine de caractères avec une expression régulière.
Fonctionnement de l'opérateur ":" :
Exemples :
Vérifier que la chaine saisie est un nombre.
$ read nb1
34657
$ read nb2
456G43
$
La variable nb1 contient uniquement des chiffres.
$ expr "$nb1" : '[0-9]*$' # Equivaut à '^[0-9]*$'
5
$ echo $?
0
$
La variable nb2 contient une lettre.
$ expr "$nb2" : '[0-9]*$'
0
$ echo $?
1
$
Compter le nombre de caractères contenus dans une variable.
$ chaine="Ceci est une ligne de texte"
$ expr "$chaine" : '.*'
27
$
Afficher la partie de la chaine correspondant à la mémorisation (ici, le chiffre entouré de pipe "|")
$ chaine="un|deux|trois|4|cinq|six|sept"
$ expr "$chaine" : '.*|\([0-9]\{1\}\)'
4
$
Le caractère * recherche toujours la chaine la plus longue. Le "|" le plus à droite.
$ expr "$chaine" : '\(.*\)|'
un|deux|trois|4|cinq|six
$
Solution permettant de s'arrêter au premier "|".
$ expr "$chaine" : '\([^|]*\)|'
un
$
Le script suivant test si la saisie correspond à un nombre (positif ou négatif) et effectue la somme des nombres saisis.
$ nl ./sumnb.sh
1 #!/bin/bash
2 somme=0
3 while :
4 do
5 echo -e "Saisir un nombre entier : \c"
6 if read nombre
7 then
8 if ( expr "$nombre" : '[0-9]*$' || expr "$nombre" : '-[0-9]*$' ) > /dev/null
9 then
10 somme=`expr $somme + $nombre`
11 else
12 echo "Saisie incorrecte"
13 fi
14 else
15 break
16 fi
17 done
18 echo -e "\nResultat : $somme"
19 exit 0
$
Exécution du script.
$ ./sumnb.sh
Saisir un nombre entier : 45
Saisir un nombre entier : 69
Saisir un nombre entier : er
Saisie incorrecte
Saisir un nombre entier : 9y
Saisie incorrecte
Saisir un nombre entier : 2
Saisir un nombre entier : -89
Saisir un nombre entier : ^d # Saisie clavier ctrl+d
Resultat : 27
$