• Aucun résultat trouvé

La commande ”expr”

Syntaxe :

expr expression

Les arguments de la commande "expr" sont consid´er´es comme une expression.

La commande "expr" ´evalue ses arguments et ´ecrit le r´esultat sur la sortie standard. "expr", comme toutes les commandes Unix, doit avoir ses arguments s´epar´es par des espaces. La premi`ere utilisation de "expr"

concerne les op´erations arithm´etiques simples. Les op´erateurs +, -,

* et / correspondent respectivement `a l’addition, `a la soustraction,

`

a la multiplication et `a la division.

La seconde utilisation de la commande "expr" concerne la comparaison et la gestion des cha^ınes de caract`eres gr^ace `a l’op´erateur ":". Celui-ci permet de compter combien de fois appara^ıt, dans l’expression plac´ee en premier membre, l’expression r´eguli`ere sp´ecifi´ee en second membre.

Pour plus de renseignements, reportez vous au chapitre 13.

9.3. La commande ”expr”

Il est possible d’effectuer des regroupements gr^ace `a des parenth`eses, comme dans toute op´eration arithm´etique.

Attention

:

Ne pas oublier que le processus d’´evaluation du shell effectue ses op´erations avant de passer le contr^ole `a la commande "expr". Par cons´equent, les caract`eres "*", "("

et ")" risquent d’^etre ´evalu´es par le shell et non pas pass´e en argument `a la commande "expr". Il faudra donc les faire pr´ec´eder du caract`ere "\" (cf. sections 4.5 et 10).

Tout d’abord, le shell cherche une variable dont le nom est "X+4". En supposant qu’elle n’existe pas, la commande "expr" ne re¸coit qu’un seul argument :l’expression "X+4", ce qui n’a aucun sens.

Z=‘expr $X * $Y‘

Les variables "X" et "Y" existent bien et contiennent des valeurs num´eriques. Par cons´equent, le r´esultat de l’´evaluation de "$X" et "$Y" est valide. Par contre,

"*" est un m´etacaract`ere valide du shell (cf. section 4.5). Il doit donc ^etre remplac´e par les fichiers correspondants, c’est-`a-dire tous les fichiers du r´epertoire courant. L’expression devient alors :

Z=‘expr 3 fic1 fic2 fic3 fic4 fic5 fic6 4‘

en supposant que les variables "X" et "Y" contiennent respectivement les valeurs "3 " et "4" et que le r´epertoire courant contient les fichiers "fic1",

"fic2", "fic3", "fic4", "fic5" et "fic6".

Z=‘expr ( $X \* $Y ) + $Z‘

S.Baudry, Introduction `a la programmation Bourne Shell – v4.0 85

Chapitre 9. Commandes ´evolu´ees pour les scripts

Ici, les caract`eres "(" et ")" sont pris en compte par le m´ecanisme d’´evaluation du shell : ils indiquent une expression `a ex´ecuter dans un processus s´epar´e (cf.

section 10). Il appara^ıt que, ne serait-ce que pour la syntaxe, cette expression est invalide pour le shell.

C’est donc le shell qui renverra une erreur et non pas la commande "expr".

Chapitre 10

Les listes de commandes et les fonctions

10.1 Les listes de commandes

Une liste de commandes est une s´equence d’un ou plusieurs pipes ou commandes s´epar´es par l’un des caract`eres suivants :

Caract`ere Signification

; Le shell attend que l’expression pr´ec´edant le

caract`ere " ;" soit termin´e pour passer `a la suivante.

& Le shell ex´ecute l’expression pr´ec´edent en arri`ere plan et passe `a la suivante.

&& Le shell ne passe que l’expression suivant seulement si le premier a renvoyer une valeur nulle comme code de retour (code "TRUE").

|| Le shell ne passe qu’au pipe suivant seulement si le premier a renvoy´e une valeur non nulle comme code de retour (code "FALSE").

Exemple 10.1 :

ls -lR | wc -l; more /usr/lib/sendmail/sendmail.cf ls /usr/bin; cat /etc/passwd

find / -print >big.file & ls /usr/bin [ -f /etc/passwd] && cat /etc/passwd

Chaque liste de commandes peut ^etre regroup´ee de deux fa¸cons :

Syntaxe Signification

(liste) Ex´ecute la liste dans un sous shell sans perturber le contexte du shell courant.

Suite page suivante · · · 87

Chapitre 10. Les listes de commandes et les fonctions

Suite de la page pr´ec´edente · · ·

Syntaxe Signification

{liste ;} Ex´ecute la liste dans le shell courant. Aucun sous shell n’est cr´e´e.

Exemple 10.2 :

L’exemple ci-apr`es permet de recopier le contenu d’un r´epertoire vers un autre. Pour cela, on utilise la commande "tar(1)". L’option "-c" permet de cr´eer une archive, l’option "-x" permet d’extraire les informations. Lorsque l’option "-f" est pr´ecisi´ee sur la ligne de commande, le premier argument de la commande "tar" est le nom du fichier o`u l’archive doit

^

etre ´ecrite ou lue. Le fichier sp´ecifi´e ici est "-"

indiquant l’entr´ee ou la sortie standart. Lors de la cr´eation d’une archive, la commande "tar" admet au moins un argument : le fichier `a sauvegarder ou bien le nom d’un r´epertoire contenant le point de l’arborescence `a sauvegarder.

cd /home/users/schmoll; tar -cvf - . | (cd /tmp/trf; tar -xvf -) L’expression pr´ec´edente peut se d´ecomposer en trois

´

etapes :

1. Changement de r´epertoire.

2. Cr´eation d’un processus dans lequel la commande

"tar" doit s’ex´ecuter. Celle-ci cr´ee une archive contenant l’arborescence du r´epertoire courant (le r´epertoire "/home/users/schmoll") et l’envoie sur sa sortie standard.

3. Cr´eation d’un nouveau processus dont l’entr´ee standard est redirig´ee sur la sortie standard de la commande "tar" pr´ec´edente. Ce sous processus se d´eplace dans l’arborescence (r´epertoire "/tmp/trf") et cr´ee un nouveau sous processus pour ex´ecuter une autre commande "tar" lisant le contenu de l’archive

`

a extraire sur l’entr´ee standard.

cd /tmp/trf ; tar xvf

cd /home/users/schmoll ; tar -cvf - .

Fig.10.1 – Enchaˆınement de commandes et mod`ele d’ex´ecution En conclusion, le premier membre de l’expression (`a gauche du symbole "|" prend le contenu du r´epertoire

"/home/users/schmoll" et l’envoie sur sa sortie standard