Vous êtes sur la page 1sur 22

LA PROGRAMMATION SHELL

R
appelons brivement lide fondamentale de Unix : tout ce qui se fait en Unix est
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 com-
mandes sont des programmes spars qui tournent sous la supervision de Unix.
Quand elles se terminent, le shell attend une autre commande. La plupart des com-
mandes 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), ventuelle-
ment 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 commande
ls -la
est forme du mot de commande ls et de deux options. Les options sont normale-
ment 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
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 16
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 fi-
chiers un endroit quelconque dans la hirarchie du systme de fichiers.
Un nom de fichier 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 fr-
quent 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 correspon-
dant, 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*
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 17
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. Le filtrage des mtacaractres est fait avant lexcution de la com-
mande;
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 18
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
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 19
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 va-
riable 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 pre-
mier :) 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 tra-
vaillez. 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.
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 20
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 com-
mande 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 com-
mande :
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 pro-
gramme, avoir des arguments. A lintrieur du script, ces arguments peuvent tre
rfrs par des paramtres spciaux (connus sous le nom de paramtres position-
nels). 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
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 21
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 don-
nes 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 possi-
bles : $# 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.
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 22
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
vrai si fichier existe et nest pas un catalogue;
test -r fichier
vrai si fichier existe et est accessible en lecture;
test -w fichier
vrai si fichier existe et est accessible en criture;
test -d fichier
vrai si fichier existe et est un catalogue;
test chane
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 23
vrai si chane est une chane de caractres non vide;
test -n chane
mme chose que test chane;
test -z chane
vrai si chane est une chane de caractres vide
test chane
1
= chane
2
vrai si la chane de caractres chane1 est identique la chane de
caractres chane
2
test chane1 != chane2
vrai si la chane de caractres chane
1
est diffrente de la chane de
caractres chane2
test n
1
-eq n
2
vrai si le nombre n1 est gal au nombre n2
test n
1
-ne n
2
vrai si le nombre n1 est diffrent du nombre n2
test n
1
-gt n
2
vrai si le nombre n1 est suprieur au nombre n2
test n
1
-ge n
2
vrai si le nombre n1 est suprieur ou gal au nombre n2
test n
1
-lt n
2
vrai si le nombre n1 est infrieur au nombre n2
test n
1
-le n
2
vrai si le nombre n
1
est infrieur ou gal au nombre n
2
! 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
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 24
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
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 25
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 sappli-
que).
Notez que chaque cas est termin par deux points-virgules et que esac (case len-
vers, dans le bon vieux style de Algol-68) termine la commande case.
Le filtre peut tre nimporte quelle chane de caractres combine avec des mtaca-
ractres. 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)
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 26
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
[elseliste-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-com-
mande du if.
Nous pouvons, par exemple, recrire notre commande create en ne crant des fi-
chiers que si le nom du fichier quon veut crer nexiste pas encore :
for i
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 27
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.
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 28
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 condi-
tion est vraie, pendant que until rpte une action jusqu ce quune certaine condi-
tion 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 tl-
phone se trouve dans votre catalogue de login et sappelle agenda. Afin dy accder,
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 29
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 dlimita-
teur 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
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 30
edg chane
1
chane
2
fichier
est alors quivalent
ed fichier <<%
g/chane1/s//chane2/g
w
%
et change toutes les occurrences de la chane chane
1
dans le fichier fichier en
chane2.
Naturellement, on peut galement inhiber individuellement la substitution en quo-
tant 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.
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 31
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
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 32
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 mtacarac-
tre !
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 lint-
rieur de scripts shell.
Prenons comme exemple la commande 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 der-
nires 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 com-
mandes. Dans ce paragraphe nous en donnerons un court rsum.
Avant lexcution dune commande les substitutions suivantes ont lieu :
substitution de paramtres, par exemple: $user
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 33
substitution de commandes, par exemple : `pwd`. Il ny a quune seule substitu-
tion ! Si, par exemple, la valeur de la variable $X est la chane $Y, la com-
mande
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 substitu-
tion 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 :
mot
entre/sortie
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 34
nom=valeur
commande-simple :
item
commande-simple item
commande :
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
else-part :
elif liste-de-commandes then liste-de-commandes else-part
elseliste-de-commandes
rien
pipeline :
commande
pipeline | commande
andor :
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
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 35
fichier :
mot
& digit
&-
case-part :
filtre) liste-de-commandes;;
filtre :
mot
filtre | mot
rien :
mot :
une squence de caractres (sans espace, tabulation, line-feed)
nom :
une squence de caractres, digits ou souligns commenant par une
lettre
digit :
0 1 2 3 4 5 6 7 8 9
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
* filtre tout caractre(s) ou rien
? filtre un seul caractre
[ ... ] filtre chacun des caractres inclus
Septembre 1995 Introduction aux Langages Informatiques
H. Wertz La programmation Shell
Page 36
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
Introduction aux Langages Informatiques Septembre 1995
La programmation Shell H. Wertz
Page 37