Académique Documents
Professionnel Documents
Culture Documents
Unx3 PDF
Unx3 PDF
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
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.
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
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
La programmation Shell
Page 18
Septembre 1995
2.
Tous les noms qui filtrent sont donns comme arguments spars, en
ordre alphabtique, la commande;
3.
H. Wertz
Septembre 1995
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
PS1
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
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
Septembre 1995
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
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
Septembre 1995
Finalement, une ligne commenant par un : (double point) est ignore par shell et
peut donc contenir des commentaires.
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
test chane
La programmation Shell
Page 23
H. Wertz
Septembre 1995
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 programmation Shell
Page 24
Septembre 1995
La slection case
La programmation Shell
Page 25
H. Wertz
Septembre 1995
H. Wertz
La programmation Shell
Page 26
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
H. Wertz
Septembre 1995
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
Septembre 1995
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
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
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
Septembre 1995
La Substitution De Paramtres
H. Wertz
Septembre 1995
La Substitution De Commandes
H. Wertz
La programmation Shell
Page 32
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.
La programmation Shell
Page 33
H. Wertz
Septembre 1995
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.
substitution de paramtre
substitution de commande
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
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
fichier :
mot
& digit
&case-part :
filtre :
filtre) liste-de-commandes;;
mot
filtre | mot
rien :
mot :
nom :
digit :
b) Filtres
*
?
[ ... ]
H. Wertz
La programmation Shell
Page 36
Septembre 1995
c) Substitution
${...}
`...`
d) Quotations
\
...
...
e) Mots rservs
if, then, else, elif, fi, case, in, esac, for, while, until, do, done
La programmation Shell
Page 37
H. Wertz