Professional Documents
Culture Documents
com
Le langage de commandes
Bourne Shell
LAZREK Mohamed
LE SHELL
Notions et mécanismes de base
Le Shell est l’interpréteur de commandes d'UNIX.
C'est un programme qui lit les commandes qui lui sont transmises
et les interprète.
$sh ^D ^D ^D
$ps ps ps
^D
^D ps ps
^D
^D
Variables
Les variables sont désignées par des mots, elles ne se déclarent pas, et leur
type (numérique ou chaîne) dépend de leur interprétation par les
commandes.
La valeur est une chaîne de caractères :
Cours=unix poids=156
export N
N est visible dans les sous-programme Shell activés ultérieurement. Un
processus voit une variable externe exportée par son père, mais il n’en voit
qu’une copie dans son environnement.
La liste des variables visibles à un instant donné est obtenue par la commande
interneset , et la liste des variables exportées dans l’environnement 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
éditeur de texte
taper le programme
le sauvegarder
changer les permissions :
chmod u+x nom du programme
l’exécuter :
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 spéciales :
Remarque :
S’il y a plus de 9 paramètres, il faut utiliser shift
TP 1:
Écrire le script shell qui permet :
d’afficher le nom de ce script shell
d’afficher tous les paramètres
de lister sur l’écran le 2° fichier
de copier le 1° fichier dans le 3° fichiers
Boucle : for
forme général
for i in A B C
do
echo $i
done
Remarque :
for i in 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 d’un mot dans une suite de fichiers,
le mot et les fichiers sont passés 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 :
cp $fich oldc.$fich
done
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)
Autre solution :
head -10 *.c
Remarque :
dans un SC on peut mettre exit N°
Exemple :
0 : mot trouvé
Boucle conditionnelle : « while »
while commande_de_contrôle
do
commandes
done
$ rech ali f1 f2 f3 f4
mot=$1
shift
$ prg a b c
il faut un seul paramètre
$ prg a
il y a un seul paramètre
if test $# -eq 1
then
echo il y a un seul paramètre
else
echo il faut un seul paramètre
fi
Exemple :
Problème ?
Si le fichier n‘existe pas : affichage
d’un message de rm
Exemple :
case valeur in
choix_1) commandes ;;
choix_2) commandes ;;
...
*) commandes ;; # cas par défaut
esac
Exemple :
echo N° de la commande que vous souhaitez \?
echo1- date 2- who
echo3- ls 4- pwd
read choix
case $choix in
1) date;;
2) who;;
3) ls;;
4) pwd;;
*) echo choix incorrect
esac
TP 3 :
Un programme qui permet de supprimer tous les
fichiers dont l’extension est old
De sauvegarder les fichiers dont l’extension est c
dans le sous répertoire sauvec du répertoire
courant
De sauvegarder les fichiers dont l’extension est f
dans le sous répertoire sauvef du répertoire
courant
Les autres fichiers à garder dans le répertoire
courant
for fich in *
do
case $fich in
*.old) rm $fich;;
*.c) mv $fich sauvec;;
*.f) mv $fich sauvef;;
esac
done
Problème :
Si le sous répertoire sauvec ( et/ou sauvef )
n’existe pas?
L’instruction « test »
! négation
-a et logique
-o ou logique
Exemple :
$ test ! –r fich
$ echo $? (c’est 0=vrai ou 1=faux)
Vrai si fich existe et si pas de droit en lecture
$ 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 ` # incrémentation de la variable N
Exemple :
Convertir chaque argument de minute en
seconde
Option de compilation :
if [ -f `basename $prog `
.o .c ]
then
rm $prog
fi
done
Problème :
Le script shell qui permet de chercher et
d’afficher tous les sous répertoires,
à partir d’un répertoire 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 `pwd`
fi
for i in *
do
if test –d $i
then
$HOME/cherche
cherche $1 $i $1 $i
fi
done
Cette commande aurait pu s’écrire en utilisant la
commande find :
Exemple :
calcul ali f1 f2 f3 f4
TP 5 :
Compléter les TPs précédents