Professional Documents
Culture Documents
com
Le langage de commandes
Bourne Shell
LAZREK Mohamed
LE SHELL
Notions et mcanismes de base
Le Shell est linterprteur de commandes d'UNIX.
Enfin, le Shell est un langage de programmation structur, muni de nombreuses commande de contrle et directement interprt.
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 $
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
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)
Exemple : echo je suis le shell script $0 echo mes arguments sont $* echo mon premier arguments est $1
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
valeur 2
...
Exemple 1 :
for i in A B C do echo $i done
for i in
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 :
$*
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
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
echo
$prog
head
done
-10
$prog
Autre solution :
head -10 *.c Pb : pas de nom des fichiers
Remarque :
dans un SC on peut mettre exit N
$ echo $?
0 : mot trouv
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
done
Exemple :
Programme qui affiche ses arguments : $ prg un deux trois un deux trois
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 ?
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
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;;
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
Linstruction test
La commande test permet deffectuer divers types de tests: test dtat de fichier test de comparaison de chanes test de comparaison numrique
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
# galit
# non galit
test -n chane
test -z chane
test chane
# chane nulle
test n1
test n1
test n1
test n1
n2
n2
# galit
# non galit
n2
n2
# suprieur
# infrieur
n2
n2
# suprieur ou gal
# infrieur ou gal
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
Exemple : Convertir chaque argument de minute en seconde On ne connat pas le nombre de paramtre
Option de compilation : -c : suppression de ldition de lien, cration du .o (compilation spare) gcc c proc.c proc.o
`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`
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.
f1
f2
f3
f4