Вы находитесь на странице: 1из 65

systemesdeproduction.blogspot.

com

Le langage de commandes

Bourne Shell
LAZREK Mohamed

LE SHELL
Notions et mcanismes de base
Le Shell est linterprteur de commandes d'UNIX.

Il est lanc automatiquement lors de la connexion.


C'est un programme qui lit les commandes qui lui sont transmises et les interprte. Par exemple, lorsque vous saisissez une commande au clavier, celle-ci est lue par le shell qui transmet au noyau les tches excuter,

Ce mode est appel mode interactif


Le Shell peut galement lire ses donnes dans un fichier de commandes, Ce mode non

interactif fait l'objet des paragraphes suivants.

Enfin, le Shell est un langage de programmation structur, muni de nombreuses commande de contrle et directement interprt.

Un shell est un programme qui lit une commande sur le clavier,


analyse ses paramtres et lexcute en lui transmettant ces paramtres : programme shell :

Rpter lire ligne commande analyser et traiter les paramtres excuter commande jusqu commande = logout ou fin fichier entre
Le Shell est l'interface de commande du systme Il est possible pour un utilisateur dexcuter plusieurs commandes shell : $ps $sh sh sh sh sh $ps Shell Shell Shell Shell $sh ^D $sh ^D ^D $ps ps ps ^D ^D ps ps ^D ^D

ps

Variables
Les variables sont dsignes par des mots, elles ne se dclarent pas, et leur type (numrique ou chane) dpend de leur interprtation par les commandes. La valeur est une chane de caractres : Cours=unix poids=156 L'initialisation d'une variable se fait par une affectation :

variable=valeur
sachant qu'il n'a pas d'espaces de chaque cot du symbole =

Expansion des variables La prise de valeur dune variable ou dun paramtre est ralise par loprateur $ plac devant le nom de la variable ou du paramtre. $ N=1 $ echo $N 1
deux types de variables - cres par l'utilisateur - cres et maintenues par le systme

Variables Shell prdfinies HOME nom du rpertoire personnel exemple : /home/enim/prof1 PATH rgles de recherche des commandes LOGNAME : exemple ali PS1 invite primaire, Par dfaut, le dollar PS2 invite secondaire; Par dfaut , le > $ echo ceci est une > trs longue > phrase Ceci est une trs longue phrase $

Remarques : Une variable peut tre dtruite par la commande interne unset, mais les variables PATH, PS1, PS2 ne peuvent tre dtruites. On peut modifier la valeur des variables prdfinis dont le nom suit la syntaxe du SHELL. La commande set imprime les variables du Shell

Lectures et affichages
La commande interne read admet en paramtre une ou plusieurs variables spares par un sparateur de mot.

La commande echo na pas doption, et admet dans ses paramtres des squences dchappement pour afficher des caractres spciaux.

$ cours=unix $ echo la valeur du cours est $cours la valeur du cours est unix $ moi=/home/ali $ cd / $ pwd / $ cd $moi $ pwd /home/ali $

Variables Shell locales


Une variable ordinaire est une variable locale; elle nest connue que dans le Shell o elle t cre. Une variable de mme nom cre dans un sous-Shell, sera une variable distincte. La valeur de la mme variable dans le Shell pre nest pas modifie. Tout Shell a ses propres variable globales appartenant son environnement

Variables Shell globales


La porte dune variable est le processus qui la cre. Pour tre dans les processus Shell qui seront crs par la suite, une variable doit tre exporte par la command interne export : elle est alors place dans lenvironnement du processus, environnement dont hritent ses fils :

export N
N est visible dans les sous-programme Shell activs ultrieurement. Un processus voit une variable externe exporte par son pre, mais il nen voit quune copie dans son environnement. La liste des variables visibles un instant donn est obtenue par la commande interne set, et la liste des variables exportes dans lenvironnement est obtenue par la commande env.

$ cours=unix $ echo $cours unix $ sh $ echo $cours $ cours=dos $echo $cours dos $^d $ echo $cours unix

$ cours=unix $ export cours $ echo $cours unix $ sh $ echo $cours unix $ cours=dos $echo $cours dos $^d $ echo $cours unix

Sous - programmes
echo Cher utilisateur, quel est ton nom \ ? read nom echo Ravi de te connatre, $nom

Le " backslash " permet dinhiber linterprtation du caractre spcial ?


rsultat : Cher utilisateur, quel est ton nom ? ali Ravi de te connatre, ali

G1 G2 faire

Manipulation :
diteur de texte taper le programme le sauvegarder changer les permissions : chmod u+x nom du programme lexcuter :

nom du programme

Arguments
La plus part des commandes Shell acceptent des arguments:

$ mv f1 f2
notation : $1 premier argument $2 second argument ... etc

G3 G4 refair

Variables spciales :
$0 : nom de la commande en cours $* : liste des paramtres positionnels $# : nombre darguments $$ : n de processus du Shell courant,
(exemple : cration dun fichier temporaire : f$$.t)

$! : n du processus du dernier processus en


background

Exemple : echo je suis le shell script $0 echo mes arguments sont $* echo mon premier arguments est $1

$ programme moi les arguments


je suis le shell script programme mes arguments sont moi les arguments le premier argument est moi

Remarque :
Sil y a plus de 9 paramtres, il faut utiliser shift

TP 1: crire le script shell qui permet : dafficher le nom de ce script shell dafficher tous les paramtres de lister sur lcran le 2 fichier de copier le 1 fichier dans le 3 fichiers

Boucle : for
forme gnral

for variable in valeur 1 do commandes done

valeur 2

...

Exemple 1 :
for i in A B C do echo $i done

for i in

Remarque : A B C ; do ; echo $i ; done

Exemple 2 :
for i in $* do echo $i done Appel : $ programme A B C

Exemple 3 :
$ programme 1 a b c d 1a 1b 1c 1d

x= $1

shift
for i in $* do

echo $x $i
done

Exemple 4 :
Recherche dun mot dans une suite de fichiers, le mot et les fichiers sont passs en arguments.
Appel : $ rech ali f1 f2 f3

Utilisation de :

grep

1 solution :

grep $1 $*

Faux
2 solution :

Mot= $1 shift grep $mot

$*

3 solution : partir de if

Exemple 5 :
Sauvegarder tous les fichiers dont lextension est c dans des fichiers appels oldc et dont lextension est le nom de ces fichiers ab.c => oldc.ab.c

for fich in *.c do

cp
done

$fich

oldc.$fich

Exemple 6 :
echo sujets /? read sujets for i in $sujets do echo $i done

Exemple 7 :

for i in do

cat sujets.f

echo $i done

Exemple 8 : (TP 2)
Afficher les 10 premires lignes des programmes dont lextension est c

for prog in *.c do

echo

$prog

head
done

-10

$prog

Autre solution :
head -10 *.c Pb : pas de nom des fichiers

Notion dtat de sortie


( exit status ) Variable spciale : ( en plus de $0, $*, $#, $$, $! )

$? : tat de sortie de la dernire commande


excute Terminaison correcte ===> exit 0

Terminaison incorrecte ===> exit n # 0

Remarque :
dans un SC on peut mettre exit N

Exemple : $ grep mot fichier


1 : mot non trouv

$ echo $?
0 : mot trouv

Boucle conditionnelle : while


while commande_de_contrle do commandes done A chaque pas de boucle la commande_de_contrle est excute: - exit 0 ==> excution corps de la boucle - sinon ==> sortie de la boucle

Remarque :
Les instructions while et if testent ltat de sortie dune commande, et non les rsultats quelles produisent.

Exemple :
Recherche du 1 fichier qui ne contient pas une chane dans une liste de chanes, la chaine et la liste des fichiers sont en paramtres

$ rech ali f1 f2 f3 f4

mot=$1 shift while do

grep v $mot $1 shift

done

echo $1 : le premier fichier qui ne contient pas $mot


Pb : si tous les fichiers contiennent la chane ?

Exemple :
Programme qui affiche ses arguments : $ prg un deux trois un deux trois

while test $# -ne 0 do echo $1 shift done

Linstruction if
if commande_de_contrle then commandes else commandes fi if commande_de_contrle then commandes fi

Exemple :
Programme qui permet de tester si le nombre de ses paramtres est 1
$ prg a b c il faut un seul paramtre $ prg a il y a un seul paramtre

if test $# -eq 1 then echo il y a un seul paramtre else echo il faut un seul paramtre fi

Exemple : Le script Shell qui permet de supprimer un fichier pass en argument sil existe, et sil nexiste pas afficher un message.

if rm $1 2>fichier then echo fichier $1 supprim else echo le fichier $1 n\existe pas fi
Problme ?

Si le fichier nexiste pas : affichage dun message de rm

Exemple : Le script shell qui permet de supprimer le 1 fichier pass en argument si son contenu est identique au 2 fichier pass en argument

if cmp $2 $2 cmp $1 -s $1 then rm $1 echo $1 et $2 sont identiques Else echo $1 et $2 ne sont pas identiques fi

Problme : si $1 nexiste pas ?

Linstruction case
case valeur in choix_1) commandes ;; choix_2) commandes ;; ... *) commandes ;; # cas par dfaut esac

Exemple : echo N de la commande que vous souhaitez \? echo 1- date 2- who echo 3- ls 4- pwd read choix case $choix in
1) 2) 3) 4) date;; who;; ls;; pwd;;

*) echo choix incorrect esac

TP 3 : Un programme qui permet de supprimer tous les fichiers dont lextension est old De sauvegarder les fichiers dont lextension est c dans le sous rpertoire sauvec du rpertoire courant De sauvegarder les fichiers dont lextension est f dans le sous rpertoire sauvef du rpertoire courant Les autres fichiers garder dans le rpertoire courant

for fich in * do case $fich in *.old) rm $fich;; *.c) mv $fich sauvec;; *.f) mv $fich sauvef;; esac done

Problme : Si le sous rpertoire sauvec ( et/ou sauvef ) nexiste pas?

Linstruction test
La commande test permet deffectuer divers types de tests: test dtat de fichier test de comparaison de chanes test de comparaison numrique

laide dune panoplie doprateurs distincts.

Test dtat de fichier test - r fichier vrai, si existe et droit en lecture -w .criture -f ..non rpertoire -d ..rpertoire -s .taille > 0 -x .excutable

Test de comparaison de chanes = != -n -z


test chane1 = chane2
test chane1 != chane2

# galit
# non galit

test -n chane
test -z chane

# longueur non gal 0


# longueur zero

test chane

# chane nulle

Test de comparaison numrique -eq -ne -gt -lt -ge -le


test n1
test n1

test n1
test n1

test n1
test n1

-eq -ne -gt -lt -ge -le

n2
n2

# galit
# non galit

n2
n2

# suprieur
# infrieur

n2
n2

# suprieur ou gal
# infrieur ou gal

Test et oprations logiques ! ngation -a et logique -o ou logique

Exemple : $ test ! r fich $ echo $? (cest 0=vrai ou 1=faux) Vrai si fich existe et si pas de droit en lecture

if test r fich1 a w fich2 Vrai si droit en lecture sur fich1 et si droit en criture sur fich2

Calcul arithmtique expr


expr interprte, value une expression arithmtique,
le rsultat est produit en sortie $ expr 3 + 5 8 $ expr 9 - 2 7 $ expr 4 * 3 syntax error $ expr 4 \* 3 12 $ expr 12 / 3 4 $ expr 14 / 5 2 $ expr 14 % 5 4 $ N=`expr $N + 1` # incrmentation de la variable N

Exemple : Convertir chaque argument de minute en seconde On ne connat pas le nombre de paramtre

while test $1 do echo `expr 60 \* $1` shift done

Exemple : Supprimer tous les fichiers en .o qui ont leur .c

Option de compilation : -c : suppression de ldition de lien, cration du .o (compilation spare) gcc c proc.c proc.o

for prog in *.o do


if [ -f then

`basename $prog
rm $prog

.o .c ]

fi done

Problme : Le script shell qui permet de chercher et dafficher tous les sous rpertoires, partir dun rpertoire donn en second argument, qui contiennent un fichier, donn en premier argument. $ cherche / fichier.ext

cd $2 if test f $1 then echo le fichier $1 est dans le sous repertoire fi for i in * do if test d $i then $HOME/cherche cherche $1 $i $1 $i fi done

`pwd`

Cette commande aurait pu scrire en utilisant la commande find :


$ find $2 name $1 -print

TP 4 : Script shell qui permet de calculer le nombre de fichiers, dans une liste, contenant une chane de caractres. La liste de fichier ainsi que la chane de caractres sont passs en paramtres. Il faut tester lexistence de chaque fichier.

Exemple : calcul ali

f1

f2

f3

f4

TP 5 : Complter les TPs prcdents