Vous êtes sur la page 1sur 22

Septembre 1995

Introduction aux Langages Informatiques

LA PROGRAMMATION SHELL
brivement lide fondamentale de Unix : tout ce qui se fait en Unix est
Rappelons
fait par des programmes ordinaires, chacun sexcutant de la mme manire.

Bien sr, quelques-uns sont privilgis, comme le programme qui organise le login,
qui vrifie que votre nom de login et votre mot de passe sont corrects et invoque
ensuite linterprte de commande shell.
Le shell lit et interprte ce que vous tapez au terminal.
Normalement vous tapez des commandes, avec des arguments, et le shell sarrange
pour que ces commandes soient excutes et les arguments bien transmis. Les commandes sont des programmes spars qui tournent sous la supervision de Unix.
Quand elles se terminent, le shell attend une autre commande. La plupart des commandes sont simplement des programmes crits en langage C.
Cette faon de voir linterprte de commande et les commandes elles mmes est trs
originale. Unix est un des rares systmes qui permet aux utilisateurs dcrire leur
propre shell (qui est juste un autre programme utilisateur), ou de rajouter librement
des commandes supplmentaires.
Une commande shell est forme dun mot (le nom de la commande), ventuellement des options (des flags) et ventuellement des arguments.
Exemple :
la commande
ls
est forme dun seul mot, sans options ni arguments, qui, comme nous lavons vu,
liste les fichiers du catalogue de travail courant.
La com mande
ls -la
est forme du mot de commande ls et de deux options. Les options sont normalement prcdes du signe -, et chaque option est forme dune lettre. Ici, il y a donc
loption l, qui donne la description des fichiers dans un format long, et loption a
disant de lister tous (all) les fichiers.
Finalement, la commande

H. Wertz

La programmation Shell
Page 16

Introduction aux Langages Informatiques

Septembre 1995

ls a.out
est forme du nom de la commande et dun argument, le nom dun fichier. Cette
commande ne liste que le fichier a.out sil existe.

Les Noms De Fichiers

La plupart des commandes attendent, comme arguments, des noms de fichiers, qui
peuvent tre donns soit comme des noms simples, sil sagit dun fichier dans le
catalogue de travail courant, soit comme des pathnames complets, sil sagit de fichiers un endroit quelconque dans la hirarchie du systme de fichiers.
Un nom de fichier consiste en une suite de caractres alphanumriques et parfois
dun ou de plusieurs . (points). Des caractres non-alpahnumriques devraient
tre vits dans les noms, puisque beaucoup ont une signification particulire pour
le shell. Ces caractres particuliers sont appels mtacaractres. Nous en avons dj
rencontr quelques-uns : <, >, et |.
Le point . nest pas considr comme mtacaractre. Il est trs souvent utilis
pour sparer des parties communes des noms de fichiers. Par exemple, il est frquent de trouver des noms de fichiers comme :
prog.c
prog.o
prog.out
o, videmment, il sagit de diffrentes reprsentations dun mme fichier.
Le fichier prog.c, par exemple, peut tre le fichier contenant le code source dun
programme crit en C, le fichier prog.o peut correspondre au code objet correspondant, et le fichier prog.out peut tre la version excutable.
Le shell donne un mcanisme simple pour la gnration et lexpansion des noms de
fichiers donns dans des commandes.
Des pathnames, absolus ou relatifs, peuvent tre crits en remplaant des parties ou
lensemble par des caractres spciaux. Par exemple, lexpression
prog*
dnote (filtre) tous les noms de fichiers, dans le catalogue courant, qui commencent
par le mot prog. Tous les exemples ci-dessus seraient filtrs par cette criture.
Si vous donnez la commande
ls prog*

La programmation Shell
Page 17

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

le mot prog* est, avant lexcution de la commande, filtr avec les noms de fichiers
dans le catalogue courant. Les noms qui filtrent (qui commencent par prog) sont
ensuite, dans un ordre alphabtique, donns comme des arguments la commande.
Dans notre exemple,
ls prog*
est donc la mme chose que
ls prog.c prog.o prog.out
Le mtacaractre * filtre donc toutes les squences (la squence vide incluse) de
caractres dans un nom de fichier. Le caractre * lui-mme filtre tous les noms de
fichiers dans le catalogue courant.
Le mtacaractre ? filtre nimporte quel caractre dans un nom de fichier, mais,
la diffrence de *, il ne filtre quun seul caractre.
Ainsi la commande
ls prog.?
dans notre exemple, ne filtre que les noms prog.c et prog.o, mais non pas le fichier
prog.out.
La commande
ls ? ?? ???
va donc lister tous les fichiers dans le catalogue courant, qui ont des noms de un,
deux ou trois caractres.
Un autre mcanisme consiste en une squence de caractres entre crochets ([ et
]). Cette mtasquence filtre des caractres uniques de lensemble des caractres
donns entre crochets. Par exemple :
ls prog.[os]*
ne listera que les fichiers commanant par prog qui ont ensuite soit la lettre o, soit
la lettre s, suivie de nimporte quoi dautre. Donc, cette commande ne listera que les
fichiers prog.o et prog.out de notre exemple.
Il est important de rappeler que :
1.

H. Wertz

Le filtrage des mtacaractres est fait avant lexcution de la commande;

La programmation Shell
Page 18

Introduction aux Langages Informatiques

Septembre 1995

2.

Tous les noms qui filtrent sont donns comme arguments spars, en
ordre alphabtique, la commande;

3.

Si aucun nom de fichier filtre une spcification particulire, le mot


lui-mme, complt par les mtacaractres est donn en argument.

Si toutefois vous voulez utiliser un de ces mtacaractres, en tant que caractre


normal, il suffit de le faire prcder du symbol \ (encore un mtacaractre !).

Les Variables Shell

Le langage de commande de Unix, shell, permet lintroduction et lutilisation de


variables dune manire trs librale. Nimporte quelle chane de caractres (sans
mtacaractres toutefois !) peut tre une variable laquelle on peut affecter des
valeurs et dont les valeurs peuvent tre consultes.
Par exemple, la commande
moi = /usr/vlisp80/hw/
affecte la variable moi la chane /usr/vlisp80/hw/, qui est le pathname de mon
catalogue sur la machine que jutilise actuellement. Le nom moi tant librement
choisi. Pour avoir accs la valeur dune variable, il suffit de la faire prcder par le
caractre $ (dollar). Ainsi, la commande
echo $moi
va imprimer sur la sortie standard
/usr/lisp80/hw/
Une forme plus gnrale de cette substitution dune valeur de variable dans une
commande est la forme
${nom-de-variable}
qui doit tre utilise obligatoirement, si le nom-de-variable est suivi par dautres
caractres.
Par exemple, la commande
ls ${moi}foo
liste le fichier
/usr/vlisp80/hw/foo
pendant que la commande
La programmation Shell
Page 19

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

ls $moifoo
essaiera de lister le fichier dont le pathname est la valeur de la variable moifoo.
Quelques noms de variables ont une signification particulire :
PATH

Cette variable contient une liste de catalogues lintrieur desquels


shell doit chercher des commandes excuter. Le deux catalogues
/bin et /usr/bin sont la liste par dfaut. Cest dans ces catalogues que
shell trouve les commandes echo, ls et cat par exemple.
Pour donner des catalogues supplmentaires, on doit affecter la variable PATH avec une liste de catalogues, chaque catalogue tant
spar du suivant par deux points (:). Exemple :
PATH=:/usr/vlisp80/pg:/usr/eqdom/berry:/bin:/usr/bin
spcifie quen plus du catalogue courant (la chane vide avant le premier :) et des deux catalogues standard, les commandes doivent
tre cherchs dans :
/usr/vlisp80/pg
et
/usr/eqdom/berry

PS1

Contient le prompt caractre du shell. Cest le caractre que shell


affiche quand il attend une commande. Sur la plupart de systmes
cest soit $, soit %. Si vous en voulez un autre, il suffit daffecter
cette variable avec la chane que vous voulez.

TERM

La variable TERM contient le type de terminal sur lequel vous travaillez. Cette information est importante si vous voulez utiliser des
programmes vidos.

HOME

Contient le pathname de votre catalogue de login. Cest largument


par dfaut pour la commande cd.

MAIL

Est une variable consulte entre chaque commande par shell, pour
voir si vous avez reu du courrier.

Il y a encore dautres variables spciales (?, $, #, !) que nous verrons dans la suite.

H. Wertz

La programmation Shell
Page 20

Introduction aux Langages Informatiques

Septembre 1995

Les Fichiers De Commandes

De mme que tout autre programme, shell peut galement prendre des arguments
dans un fichier.
Reprenons notre exemple de la commande shell donnant le nombre dutilisateurs du
systme :
who | wc -l
Si nous voulons trs souvent savoir combien dutilisateurs sont sur le systme, il
serait adquat de construire une nouvelle commande. Pour cela, nous crons un
fichier avec la ligne de commande ci-dessous
echo who | wc -l > combien
Les quotes ici taient ncessaires pour prvenir que le | ne divise pas cette commande en deux : une premire qui cho le mot who, et une deuxime qui applique la
commande wc -l sur cela, tout en mettant la sortie dans le fichier combien.
Pour excuter ce petit programme shell (on dit dun programme shell que cest un
script) il suffit dappeler le shell et de donner le fichier combien en argument :
sh combien
Pour vraiment pouvoir considrer le fichier combien comme une commande shell
nouvelle, nous pouvons spcifier que combien est un fichier excutable avec la commande :
chmod a+x combien
qui dit de rajouter au mode de combien que ce fichier est excutable pour tout le
monde. chmod veut dire change mode.
Naturellement, des shell-scripts (procdures shell) peuvent, comme tout autre programme, avoir des arguments. A lintrieur du script, ces arguments peuvent tre
rfrs par des paramtres spciaux (connus sous le nom de paramtres positionnels). Le mtacaractre $ est utilis pour rfrer aux arguments dune commande :
$1 dnote le premier argument;
$2 dnote le deuxime argument;
$3 dnote le troisime argument;
...
$9 dnote le neuvime argument.
Le nom de la commande mme est accessible dans le paramtre $0.
Par exemple, si le fichier ou contient la ligne

La programmation Shell
Page 21

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

who | grep $1
et si ce fichier est excutable, alors
ou hw
imprimera une ligne montrant sur quel terminal hw est logg . Si hw nest pas logg,
rien ne sera imprim.
La commande grep cherche lintrieur dun texte loccurrence des expressions donnes en argument. Ici lexpression cherche est juste la chane de caractres hw.
Dans cet exemple, grep fonctionne principalement comme un filtre lisant lentre
standard et imprimant toutes les lignes contenant la chane hw.
Pendant linterprtation du script ou, le paramtre positionnel $1 sera remplac
par le mot hw. Si hw est logg, lcran devrait contenir quelque chose comme :
$ ou hw
hw tty21 May 07 14:37
$
(o le $ au dbut de la ligne est juste le prompt de shell).
En plus des paramtres positionnels, deux paramtres supplmentaires sont possibles : $# et $*.
$# donne le nombre darguments donns lappel et $* est utilis si lon veut
substituer tous les arguments sauf le nom de commande ($0).
Voici prsent une petite commande qui imprime tous ces arguments ainsi que leur
nombre :
echo ($*) $# lments
Si cette commande se trouve dans le fichier excutable nomm bidon, une excution
de la commande devrait donner ceci :
$ bidon 1 2 3
(1 2 3) 3 lments
et
$ bidon que c est beau
(que c est beau) 4 lments
Naturellement, $* est trs utile si vous avez besoin de plus de 9 arguments.

H. Wertz

La programmation Shell
Page 22

Introduction aux Langages Informatiques

Septembre 1995

Finalement, une ligne commenant par un : (double point) est ignore par shell et
peut donc contenir des commentaires.

Les Structures De Contrle

Comme dans tous les langages, une programmation effective nest pas possible sans
un minimum de structures de contrle. Shell donne des structures telles que :
for
case
if then else
while
until
Les commandes peuvent tre donnes partir dun fichier de script o partir dun
terminal. Dans ce deuxime cas, le prompt de shell change aprs la frappe de la
premire ligne dune commande. Ce deuxime prompt-caractre peut tre modifi
travers la variables PS2.

La commande test

Beaucoup des utilitaires de Unix ont un exit-status qui est gal 0 si la commande
sest bien termine et diffrent de 0 sinon. La commande test, qui na dutilit qu
lintrieur de shell-scripts, ne donne rien dautre quun tel exit-status. Naturellement,
cette commande est utilise pour diriger le flux de contrle du shell-script.
Par exemple :
test -f nom-de-fichier
donne la valeur 0 (vrai) si nom-de-fichier est un fichier qui existe et nest pas un
catalogue.
Voici la liste presque complte des arguments possibles pour test :
test -f fichier
test -r fichier
test -w fichier
test -d fichier

vrai si fichier existe et nest pas un catalogue;


vrai si fichier existe et est accessible en lecture;
vrai si fichier existe et est accessible en criture;
vrai si fichier existe et est un catalogue;

test chane
La programmation Shell
Page 23

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

vrai si chane est une chane de caractres non vide;


test -n chane
test -z chane

mme chose que test chane ;


vrai si chane est une chane de caractres vide

test chane 1 = chane 2


vrai si la chane de caractres chane 1 est identique la chane de
caractres chane 2
test chane 1 != chane 2
vrai si la chane de caractres chane 1 est diffrente de la chane de
caractres chane 2
test n1 -eq n2
test n1 -ne n2
test n1 -gt n2
test n1 -ge n2
test n1 -lt n2

vrai si le nombre n1 est gal au nombre n2


vrai si le nombre n1 est diffrent du nombre n2
vrai si le nombre n1 est suprieur au nombre n2
vrai si le nombre n1 est suprieur ou gal au nombre n2
vrai si le nombre n1 est infrieur au nombre n2

test n1 -le n2
vrai si le nombre n1 est infrieur ou gal au nombre n2
! est loprateur logique non, -a est loprateur logique binaire et et -o est
loprateur logique binaire ou.

La boucle for

La forme gnrale de la boucle for est :


for nom in liste-de-mots
do liste-de-commande
done
A chaque itration de la boucle for, la variable shell nom prend comme valeur le
mot suivant de la liste-de-mots. Si la liste-de-mots est omise, la boucle est excute
H. Wertz

La programmation Shell
Page 24

Introduction aux Langages Informatiques

Septembre 1995

pour chacun des paramtres positionnels (des arguments donns la commande).


Ainsi :
for i
est quivalent :
for i in $*
Lexcution de la boucle sarrte sil ne reste plus de mots dans la liste-de-mots. La
liste-de-commandes est une squence de une ou plusieurs commandes, spares ou
termines par un semicolon (;) ou un line feed.
Exemple :
for i in eins zwei drei
do echo $i
done
imprimera, lexcution
eins
zwei
drei
Si lon veut avoir une commande create qui cre des fichiers avec les noms de ses
arguments, elle serait crite de la faon suivante :
for i in $*
do >$i
done
ou, en plus compact :
for i do >$i; done
et lappel :
create foo bar
crerait les fichiers foo et bar.

La slection case
La programmation Shell
Page 25

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

La forme gnrale de la commande case est :


case mot in
filtre) liste-de-commande;;
...
esac
La commande case donne la possibilit de slctionner entre diffrentes possibilits.
Pendant lexcution, la liste-de-commandes associe au filtre qui correspond mot
sera excute, toutes les autres liste-de-commandes seront ignores.
Exemple :
for i in eins zwei drei
do case $i in
eins) N=un;;
zwei) N=deux;;
drei) N=trois;;
esac
echo $N
done
Cette commande imprime, lexcution :
un
deux
trois
Puisque le mtacaractre * filtre nimporte quelle chane de caractres, il peut tre
utilis pour le cas par dfaut (cest--dire pour le cas o aucun des filtres ne sapplique).
Notez que chaque cas est termin par deux points-virgules et que esac (case lenvers, dans le bon vieux style de Algol-68) termine la commande case.
Le filtre peut tre nimporte quelle chane de caractres combine avec des mtacaractres. Ainsi le filtre
*.c)
par exemple, sera choisi si le mot (le premier argument de la commande case) se
termine par la chane .c, et le filtre
-[xy])
sera slectionn pour -x et -y. Ce filtre peut galement tre crit comme :
-x | -y)

H. Wertz

La programmation Shell
Page 26

Introduction aux Langages Informatiques

Septembre 1995

ce qui veut dire que la barre verticale est un sparateur entre plusieurs filtres, et lon
peut toujours crire un filtre comme
filtre1 | filtre2 | filtre3 | ... | filtren )
si lon veut pouvoir choisir entre plusieurs alternatives.
Voici un deuxime exemple dutilisation de la commande case. Cest le prototype
pour une commande compile qui appelle le compilateur appropri dpendant de la
terminaison du nom de fichier donn en argument :
: initialise les options la chane vide
options=
: ensuite on rpte pour chaque argument
for i in $*
do case $i in
: on concatne les options permises (+ un espace)
-[ocsSO]) options = $options $i;;
-*) echo option inconnu $i ;;
:
et on compile chacun des fichiers
*.c) cc $options $i; options = ;;
*.s) as $options $i; options = ;;
*.f)f77 $options $i; options = ;;
:
sinon cest un mauvais argument
*) echo que faire avec $i\?;;
esac
done

La slection if - then - else

Cette construction peut tre utilise comme instruction de branchement. Sa forme


gnrale est :
if liste-de-commandes
then liste-de-commandes
[else liste-de-commande]
fi
La liste-de-commande suivant le if est excute et si la dernire commande de cette
liste ramne un status de 0 (vrai), alors la liste-de-commande suivant le then est
excute. La partie else est optionnelle : si elle est prsente, la liste-de-commande
correspondante est excute pour un status diffrent de 0 (faux) de la liste-de-commande du if.
Nous pouvons, par exemple, recrire notre commande create en ne crant des fichiers que si le nom du fichier quon veut crer nexiste pas encore :
for i
La programmation Shell
Page 27

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

do
if test -f $1
then echo le fichier $i existe dj
else >$i
fi
done
Voici un autre exemple : une commande qui nous dit pour chaque fichier dans le
catalogue courant si cest un catalogue ou un fichier normal et si le fichier est ouvert
en lecture ou en criture :
for a in *
do if test -d $a
then echo $a est un directory
else echo -n $a est un fichier accessible en
if test -w $a
then echo criture
else if test -r $a
then echo lecture
else echo rien
fi
fi
fi
done
Pour des test if imbriqus du style :
if ...
then ...
else if ...
then ...
else if ...
...
fi
fi
fi
existe une abrviation, et vous pouvez galement les crire de la manire suivante:
if ...
then ...
elif ...
then ...
elif ...
...
fi
A vous de dcider laquelle des deux formes dcriture vous prfrez.

H. Wertz

La programmation Shell
Page 28

Introduction aux Langages Informatiques

Septembre 1995

Remarquons que les oprateurs du et logique, &&, et du ou logique, ||, peuvent


tre crits en termes de if :

Les boucles while et until

while et until sont probablement les deux formes de boucles les plus usuelles dans
les langages de programmation. while rpte une action tant quune certaine condition est vraie, pendant que until rpte une action jusqu ce quune certaine condition devienne vraie.
La forme gnrale de ces deux commandes est :
while liste-de-commandes
do liste-de-commandes
done
et
until liste-de-commandes
do liste-de-commandes
done

Les Documents In-line

Supposons que nous voulions construire un petit script shell qui donne le numro
de tlphone des personnes dont les noms sont donns en argument au script. Pour
cela, nous allons dabord crer un fichier contenant des lignes du style :
...
Patrick Mller 230-00-01
Eva 777-10-50 (home) 888-10-50 (office)
Fred Dubois (16)(33) 4240-97-86
...
Ce fichier est une sorte de carnet dadresses, et chaque ligne contient des noms et
des numros de tlphone.
Le texte de la procdure qui nous donne pour un nom donn le(s) numro(s) de
tlphone correspondant, est relativement ais crire :
for i
do grep $i $HOME/agenda; done
Evidemment, nous utilisons la commande grep qui donne toutes les lignes dun
fichier contenant lexpression donne en argument.
Remarquez que nous avons suppos que le fichier contenant les numros de tlphone se trouve dans votre catalogue de login et sappelle agenda. Afin dy accder,
La programmation Shell
Page 29

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

nous avons utilis la variable shell HOME qui contient toujours le pathname de ce
catalogue.
Si la seule utilisation du fichier agenda est faite par cette procdure de recherche, il
semble quventuellement il serait plus ais dinclure ces donnes directement dans
ce script. Cela conomise un fichier !
Des donnes directement incluses dans une procdure shell sappellent, en jargon
Unix, des documents in-line ou des here documents.
Lcriture alternative de notre procdure sera alors:
for i
do grep $i <<!
...
Patrick Mller 230-00-01
Eva 777-10-50 (home) 888-10-50 (office)
Fred Dubois (16)(33) 4240-97-86
...
!
done
Dans cet exemple, shell prend les lignes entre <<! et ! comme entre standard
pour grep. Le caractre ! est choisi arbitrairement; le document est termin par
une ligne qui nest forme que du caractre suivant immdiatement le signe <<.
Naturellement, puisque ce document se trouve lintrieur dun script shell, avant
de donner le document grep, il y aura substitution de paramtres (si vous avez des
paramtres lintrieur du document) ou des variables utilises.
Pour inhiber cette substitution totalement, il suffit de quoter le caractre dlimitateur du document comme:
...
do grep $i <<\!
...
...
!
Voici un exemple dun script utilisant des here documents et ayant besoin de la
substitution :
ed $3 <
<%
g/$1/s//$2/g
w
%
Si cette procdure sappelle edg, lappel
H. Wertz

La programmation Shell
Page 30

Introduction aux Langages Informatiques

Septembre 1995

edg chane 1 chane 2 fichier


est alors quivalent
ed fichier <<%
g/chane 1/s//chane 2/g
w
%
et change toutes les occurrences de la chane chane 1 dans le fichier fichier en
chane 2.
Naturellement, on peut galement inhiber individuellement la substitution en quotant avec le caractre \ les occurrences du caractre $ quon veut garder tel quel
:
ed $3 <
<+
1,\$s/$1/$2/g
w
+
Cette version du script edg est plus ou moins quivalente la prcdente version.

La Substitution De Paramtres

Si un paramtre de shell na pas reu une valeur, shell substitue loccurrence de ce


paramtre la chane vide. Par exemple : si la variable d na pas reu de valeurs,
alors
echo $d
ou
echo ${d}
imprime la chane vide, cest--dire rien.
On peut donner des valeurs par dfaut comme dans :
echo ${d-.}
qui imprime la valeur de la variable d si d a une valeur et qui imprime la chane
. sinon. La chane donne comme valeur par dfaut est value. Ainsi
echo ${d-$1}
imprimera la valeur de la variable d si elle existe, sinon cela imprimera la valeur
du paramtre $1.
La programmation Shell
Page 31

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

Voyez-vous la diffrence entre


echo ${d-*}
et
echo ${d-*} ?
On peut galement affecter aux variables des valeurs par dfaut. Ainsi
echo ${d=.}
substitue la mme chane que
echo ${d-.}
mais, en plus, si d navait pas de valeur, aprs substitution, la valeur de d sera
la chane ..
Remarquons que cette affectation par dfaut nest pas possible avec des paramtres
positionnels.
Une dernire possibilit est dinterrompre le calcul en imprimant un message si une
variable na pas de valeur :
echo ${d?message
message}
imprime la valeur de d si elle existe, sinon message est imprim par le shell et
lexcution de la procdure est abandonne. Si message nest pas donn, comme
dans
echo ${d?}
un message standard est imprim.

La Substitution De Commandes

La sortie standard de commandes shell peut tre substitue de manire similaire


la substitution de paramtres.
Si, par exemple, le catalogue courant est /usr/fred/bin, la commande
d = `pwd`
est quivalent
d = /usr/fred/bin

H. Wertz

La programmation Shell
Page 32

Introduction aux Langages Informatiques

Septembre 1995

Toute la chane entre les accents graves est prise comme commande excuter et
est remplace par la sortie standard de cette commande. Cest encore un mtacaractre !
La substitution de commandes a lieu dans tous les contextes (y compris les here
documents) o normalement une substitution de paramtres a lieu. Le mcanisme
permet, par exemple, lutilisation de commandes de traitement de chanes lintrieur de scripts shell.
Prenons comme exemple la com mande basename qui enlve un suffixe spcifi
dune chane. Par exemple :
basename main.c .c
imprime la chane main. Voici une utilisation de cette commande telle quelle a lieu
dans la commande cc :
case $A in
...
*.c) `B= basename $A .c`
...
esac
qui donne la variable B la chane A sans le .c la fin.
Voici encore quelques exemple :
for i in `ls -t`; do ...
donnera i les noms de tous les fichiers du catalogue dans lordre de leurs dernires modifications.
set `date `; echo $6 $2 $3, $4
imprimera, par exemple : 88 Nov 1, 23:59:59.

Evaluation Et Inhibition De Lvaluation

Shell est un langage qui permet la substitution de paramtres, la substitution de


commandes et la gnration de noms de fichiers dans les arguments pour les commandes. Dans ce paragraphe nous en donnerons un court rsum.
Avant lexcution dune commande les substitutions suivantes ont lieu :

substitution de paramtres, par exemple: $user

La programmation Shell
Page 33

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

substitution de commandes, par exemple : `pwd`. Il ny a qu une seule substitution ! Si, par exemple, la valeur de la variable $X est la chane $Y, la commande
echo $X
imprimera $Y.

gnration de noms de fichiers : aprs substitution, chaque mot est analys pour
des occurrences des caractres *, ?, [, ] et . et une liste de noms de fichiers (en
ordre alphabtique) est gnre pour remplacer ce mot. Chacun de ces noms de
fichiers est un argument spar. Cette valuation a lieu galement dans les mots
associs une boucle for. Dans les mots utiliss dans une branche dun case, il
ny a que substitution et non pas gnration de noms de fichiers.

En plus des mcanismes pour quoter, utilisant les caractres \ et , il existe un


mcanisme pour quoter qui utilise les guillemets (). Entre guillemets, la substitution a lieu, mais la gnration de noms de fichiers et linterprtation de sparateurs
vides (espace, tabulation et retour-chariot) sont inhibs. Donc, entre guillemets, les
caractres suivants ont une signification particulire :
$

substitution de paramtre

substitution de commande

fin de chane quote

quote les caractres spciaux $, `, et \.

Si plus dune seule valuation dune chane est ncessaire, on peut utiliser la
commande eval. Par exemple, si la valeur de X est la chane $Y et si la valeur de Y
est la chane voici,
echo $X
imprime $Y. Mais
eval echo $X
imprime la chane voici

Grammaire Du Shell
item :

H. Wertz

mot
entre/sortie

La programmation Shell
Page 34

Introduction aux Langages Informatiques

Septembre 1995

nom=valeur
commande-simple :
item
commande-simple item
commande :

else-part :

pipeline :

andor :

commande-simple
(liste-de-commandes)
{liste-de-commandes}
for nom do liste-de-commandes done
for nom in mot ... do liste-de-commandes done
while liste-de-commandes do liste-de-commandes done
until liste-de-commandes do liste-de-commandes done
case mot in case-part ... esac
if liste-de-commandes then liste-de-commandes else-part
elif liste-de-commandes then liste-de-commandes else-part
else liste-de-commandes
rien
commande
pipeline | commande
pipeline
andor && pipeline
andor || pipeline

liste-de-commandes :
andor
liste-de-commandes;
liste-de-commandes&
liste-de-commandes; andor
liste-de-commandes & andor
entre/sortie :

>fichier
<fichier
>
>mot
<
<mot

La programmation Shell
Page 35

H. Wertz

Septembre 1995

Introduction aux Langages Informatiques

fichier :
mot

& digit
&case-part :
filtre :

filtre) liste-de-commandes;;
mot
filtre | mot

rien :
mot :
nom :

digit :

une squence de caractres (sans espace, tabulation, line-feed)


une squence de caractres, digits ou souligns commenant par une
lettre
0123456789

Mtacaractres Et Mots Rservs


a) Syntactique
|
&&
||
;
;;
&
()
<
<<
>
>>

symbole pour les pipes


et logique
ou logique
sparateur de commandes
dlimitateur de case
commandes background
groupement de commandes
redirection de lentre
entre en here-document
cration de sortie
rajout de sortie

b) Filtres
*
?
[ ... ]

H. Wertz

filtre tout caractre(s) ou rien


filtre un seul caractre
filtre chacun des caractres inclus

La programmation Shell
Page 36

Introduction aux Langages Informatiques

Septembre 1995

c) Substitution
${...}
`...`

substitution dune variable shell


substitution dune commande

d) Quotations
\
...
...

quote le caractre suivant


quote tous les caractres inclus, except lui-mme
quote tous les caractres inclus, except $, \ et

e) Mots rservs
if, then, else, elif, fi, case, in, esac, for, while, until, do, done

La programmation Shell
Page 37

H. Wertz

Vous aimerez peut-être aussi