Systèmes d’exploitation I
Module: M3 - INF-S3 & IAP-S3
Prof. R. HANNANE
[Link]@[Link]
Faculté des Sciences Semlalia, Marrakech
Université Cadi Ayyad
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 1/35 1 / 35
Programmation Shell
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 2/35 2 / 35
Programmation Shell
Introduction
Pourquoi la programmation Shell ?
Aucun langage de programmation n’est parfait
Il n’existe pas un langage meilleur que d’autre
⇒ Il n’y a que des langages en adéquation ou peu conseillés
pour des buts particuliers
Une connaissance fonctionnelle de la programmation shell
est essentielle à quiconque souhaite devenir efficace en
administration de système
Pensez qu’au démarrage de la machine Linux, des scripts
shell du répertoire /etc/rc.d sont exécutés pour restaurer
la configuration du système et permettre la mise en
fonctionnement des services
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 3/35 3 / 35
Programmation Shell
Introduction
Pourquoi la programmation Shell ?
Une compréhension détaillée de ces scripts de démarrage
est importante pour analyser le comportement d’un
système, et éventuellement le modifier
Ecrire des scripts shell n’est pas difficile à apprendre:
I Les scripts peuvent être construits par petites sections
I Il n’y a qu’un assez petit nombre d’opérateurs et d’options
spécifiques au shell à connaı̂tre
I Il n’existe que peu de règles à apprendre
La syntaxe est simple et directe, similaire à une suite d’appels
de différents utilitaires en ligne de commande
La plupart des petits scripts fonctionnent du premier coup
et le débogage, même des plus longs, est assez simple
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 4/35 4 / 35
Programmation Shell
Introduction
C’est quoi un script shell?
Un script shell est une méthode ”rapide”pour prototyper
une application complexe
Avoir même un sous-ensemble limité de fonctionnalités
dans un script shell est souvent une première étape utile
lors d’un projet de développement
⇒ La structure de l’application peut être testée
La programmation shell ramène à la philosophie classique
des UNIX⇒ Casser des projets complexes en sous-tâches
plus simples et assembler des composants et des utilitaires
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 5/35 5 / 35
Programmation Shell
Quand ne pas utiliser les scripts shell?(1/2)
Ne pas utiliser les scripts shell:
1 Pour des tâches demandant beaucoup de ressources et
particulièrement lorsque la rapidité est un facteur (tri, hachage, etc.)
2 Pour des procédures impliquant des opérations mathématiques
nombreuses et complexes, spécialement pour de l’arithmétique à
virgule flottante, des calculs à précision arbitraire ou des nombres
complexes (optez plutôt pour le C++ ou le FORTRAN dans ce cas)
3 Pour une portabilité inter-plateformes (utilisez le C ou Java à la
place)
4 Pour des applications complexes où une programmation structurée
est nécessaire (typage de variables, prototypage de fonctions, etc.)
5 Pour des applications critiques sur lesquelles vous misez votre avenir
ou celui de la société
6 Pour des situations où la sécurité est importante, où vous avez
besoin de garantir l’intégrité de votre système et de vous protéger contre
les intrusions et le vandalisme
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 6/35 6 / 35
Programmation Shell
Quand ne pas utiliser les scripts shell?(2/2)
7 Pour des projets consistant en de nombreux composants avec des
dépendances inter-verrouillées
8 Lorsque des opérations importantes sur des fichiers sont requises
(Bash est limité à un accès fichier en série, ligne par ligne, ce qui est
particulièrement maladroit et inefficace)
9 Si le support natif des tableaux multidimensionnels est nécessaire
10 Si vous avez besoin de structures de données, telles que des listes
chaı̂nées ou des arbres
11 Si vous avez besoin de générer ou de manipuler des graphiques ou
une interface utilisateur (GUI) lorsqu’un accès direct au matériel est
nécessaire ;
12 Lorsque vous avez besoin d’accéder à un port, à une socket
d’entrée/sortie
13 Si vous avez besoin d’utiliser des bibliothèques ou une interface
propriétaire
14 Pour des applications propriétaires, à sources fermées (les sources
des shells sont forcément visibles par tout le monde)
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 7/35 7 / 35
Programmation Shell
Les différents shells
Il existe plusieurs shell :
I sh : Bourne Shell. L’ancêtre de tous les shells
I bash: Bourne Again Shell, version améliorée du shell
Bourne sous Unix, disponible par défaut sous Linux et Mac
OS X
I ksh : Korn Shell. Un shell puissant assez présent sur les
Unix propriétaires, mais aussi disponible en version libre,
compatible avec bash
I csh : C Shell. Un shell utilisant une syntaxe proche du
langage C
I tcsh : Tenex C Shell. Amélioration du C Shell
I zsh : Z Shell. Shell assez récent reprenant les meilleures
idées de bash ksh et tcsh
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 8/35 8 / 35
Programmation Shell
Les différents shells
Note:
Les fonctionnalités offertes par l’invite de commandes
peuvent varier en fonction du shell que l’on utilise(sh,
bash,ksh,zsh,...)
Pour connaı̂tre le shell sous lequel on travaille, on tape :
> echo $SHELL
⇒ Exemple d’affichage: /bin/bash
Pour changer le shell, on utilise la commande: chsh
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 9/35 9 / 35
Programmation Shell
Exemple
Le script suivant a pour nom Bonjour :
#!/bin/bash
# afficher un message
echo ”Bonjour, c’est mon premier script”
A part la première ligne, les lignes commençant par le caractère
# sont des commentaires (des textes qui doivent aider à
comprendre ce que fait un programme)
Ces lignes ne sont pas interprétées par le shell
La première ligne d’un script doit toujours indiquer le shell qui
doit être utilisé pour l’interpréter
Par exemple, pour le bash, la première ligne d’un script doit être:
#!/bin/bash
Il est nécessaire de donner l’adresse absolue du shell, à partir
de la racine
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 10/35 10 / 35
Programmation Shell
Exécution d’un script shell
Avant de lancer un script shell, il faut s’assurer qu’il est
exécutable ⇒ On affecte simplement le droit d’exécution par la
commande :
> chmod + x nomScript
Pour l’exécution du script :
> ./ nomScript
ou simplement :
> nomScript
Pour des raisons de sécurité, le répertoire courant (./)
n’est pas inclus par défaut dans le $PATH de l’utilisateur
⇒ Avant tout, il faut s’assurer que la variable PATH de votre
machine, contient la référence au répertoire courant
Pour changer la variable PATH :
> PATH = \ $PATH :.
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 11/35 11 / 35
Programmation Shell
Exécution d’un script shell
Exemple:
> chmod + x Bonjour
> ./ Bonjour
Bonjour , c est mon premier script
Enfin, après les tests et le débogage final, déplacer le
script dans /usr/local/bin (en tant que root), pour le rendre
utilisable par tous les autres utilisateurs du système
Le script pourra alors être appelé en tapant simplement
nomScript sur la ligne de commande
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 12/35 12 / 35
Programmation Shell
Débogage d’un script shell
Pour déboguer un script shell bash soit:
I Sur l’invite de commande, utiliser:
bash -x nomScript
I Dans le script shell, utiliser les deux commandes suivantes:
set -x # activer le mode débogage
... d’autres lignes de commandes
set +x # désactiver le mode débogage
I Dans la ligne Shebang standard du script shell, remplacer
#!/bin/bash par #!/bin/bash -xv
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 13/35 13 / 35
Programmation Shell
Les variables internes
Le shell reconnaı̂t de nombreuses variables. Voici quelques unes des variables
d’environnement du bash
I HOSTNAME : Contient le nom de la machine
> echo $HOSTNAME
I HOSTTYPE : Type de la machine
> echo $ HOSTTYPE
I LANG : Définit la langue utilisée par la machine (fomat de l’affichage de la date)
> echo $LANG
I PATH : Indique les chemins de recherche pour les commandes à exécuter
> echo $PATH
I PPID : Donne le numéro du processus parent du shell. Le numéro du processu
courant est accessible via le paramétre $
> echo $PPID
I RANDOM : Donne un entier aléatoire
I MAILMSG : message d’alerte à l’arrivé d’un courrier
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 14/35 14 / 35
Programmation Shell
Les paramètres
Il est possible de faire passer plusieurs paramètres à un
script
Les paramètres sont placés à la suite du nom du script, et
séparés par des espaces, comme pour une commande standard
A l’intérieur du script, la valeur de ces paramètres est
récupérée grâce aux variables ’1’ à ’9’
Par exemple, la ligne :
> echo $3
Renverra la valeur du troisième paramètre si il existe, rien
sinon
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 15/35 15 / 35
Programmation Shell
Les paramètres
Autre :
I $0 : Contient le nom du script tel qu’il a été invoqué
I $* : L’ensemble des paramètres sous la forme d’un seul
argument
I $@ : L’ensemble des arguments, un argument par
paramètre
I $# : Le nombre de paramètres passés au script
I $$ : Le PID du shell qui exécute le script
I $! : Le PID du dernier processus lancé en arrière-plan
I $? : Le code retour de la dernière commande
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 16/35 16 / 35
Programmation Shell
Les paramètres
Exemple :
Soit le script qui porte le nom essai :
#!/bin/bash
echo "La commande $0 a $# arguments"
echo ’$1= ’$1
echo ’$2= ’$2
echo ’$*= ’$*
shift
echo "Maintenant il y a $# arguments"
echo ’$1= ’$1
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 17/35 17 / 35
Programmation Shell
Les paramètres
Exécutons ce script :
> ./essai alpha beta gamma # a 3 arguments
Résultat :
La commande ./essai a 3 arguments
$1=alpha
$2=beta
$*=alpha beta gamma
Maintenant il y a 2 arguments
$1 = beta
Note:
La fonction shift permet de décaler la liste des
paramètres d’un cran vers la gauche
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 18/35 18 / 35
Programmation Shell
Code de retour d’une commande
Le code de retour d’une commande est un mécanisme
fourni par le shell (quel qu’il soit) qui signale à
l’utilisateur si l’exécution de cette commande s’est bien
déroulée ou bien s’il y a eu un problème quelconque
Le code de retour est un petit entier positif ou nul, toujours
compris entre 0 et 255
Par convention, un code de retour égal à 0 signifie que la
commande s’est exécutée correctement
Un code différent de 0 signifie soit une erreur d’exécution,
soit une erreur syntaxique
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 19/35 19 / 35
Programmation Shell
Code de retour d’une commande
Exemple :
> pwd
/home/abdessamad
> echo $?
0
⇒ la commande s’est exécutée correctement
> ls -l vi
ls:vi: Aucun fichier ou répertoire de ce type
> echo $?
2
⇒ erreur d’exécution !
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 20/35 20 / 35
Programmation Shell
La commande test
La commande test, comme son nom l’indique, permet
d’effectuer différents tests sur des fichiers, des répertoires
ou des expressions arithmétiques
Elle s’utilise en association avec if, while et until pour
évaluer le résultat vrai ou faux d’une expression
-r fichier : vrai si le fichier existe et est accessible en
lecture
-w fichier : vrai si le fichier existe et est accessible en
écriture
-x fichier : vrai si le fichier existe et est exécutable
-f fichier : vrai si le fichier existe et est un fichier régulier
-d fichier : vrai si le fichier existe et est un répertoire
-e fichier : vrai si le fichier existe
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 21/35 21 / 35
Programmation Shell
Calculs arithmétiques
expr $a+$b : Donne le résultat de l’addition de a et b
expr $a−$b : Donne le résultat de la soustraction de a et b
expr $a\∗$b : Donne le résultat de la multiplication de a et
b
expr $a/$b : Donne le résultat de la division de a par b
expr $a%$b : renvoie le reste de la division entière de a
par b
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 22/35 22 / 35
Programmation Shell
Structures de contrôle
Le shell offre les mêmes structures de contrôle qu’un
langage de programmation comme le C
1 Structure conditionnelle
2 Boucle for
3 Boucle while/Until
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 23/35 23 / 35
Programmation Shell
Structures de contrôle
1) Structure conditionnelle
L’instruction if permet d’effectuer des opérations si une
condition est réalisée, et d’autres sinon
La structure la plus simple est la suivante :
if < condition >
then <liste d’instructions>
else <suite d’instructions>
fi
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 24/35 24 / 35
Programmation Shell
Structures de contrôle
1) Structure conditionnelle
On peut écrire des conditions à l’aide de la commande
test qui peut être utilisée pour comparer deux entiers :
-eq ⇒ =
-ne ⇒ différent
-lt ⇒ <
-le ⇒ < ou =
-gt ⇒ >
-ge ⇒ > ou =
Exemple:
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 25/35 25 / 35
Programmation Shell
Structures de contrôle
2) Boucle for
L’instruction for permet de répéter une instruction pour un
ensemble de paramètres
La syntaxe est:
for variable in liste
do <suite de commande>
done
Exemple:
Pour tous les fichiers texte, on enlève le droit de lecture aux
autres utilisateurs:
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 26/35 26 / 35
Programmation Shell
Structures de contrôle
3) Boucle While/Until
Ces deux instructions permettent de faire exécuter une liste
d’instruction tant qu’une (ou jusqu’à ce qu’une) certaine
condition soit réalisée
Syntaxe:
Syntaxe de While Syntaxe de until
while condition until condition
do do
liste commandes liste commandes
done done
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 27/35 27 / 35
Programmation Shell
Structures de contrôle
3) Boucle While/Until
Exemple:
⇒ La réponse au lancement de ce script est : 45
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 28/35 28 / 35
Programmation Shell
Les opérateurs logiques
Pour former des expressions un peu plus complexe, les
opérateurs ! (” non” ), -a (”et”) et -o (”ou”) peuvent
être utilisés, mais également les parenthèses
Exemple:
if test $a = $b -o $a!= $c
then echo ”a est égal à b ou a est différent de c”
else echo ”a est différent de b et égal à c”
fi
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 29/35 29 / 35
Programmation Shell
Comparaisons de chaı̂nes de caractères
La commande suivante : expr $str2 : $str1
I compare la chaı̂ne de caractères str1 à la chaı̂ne de
caractères str2
I Elle s’arrête dès que les chaı̂nes de caractères différent ou
à la fin de str1
I Elle renvoie le nombre de caractères en commun si les
chaı̂nes coı̈ncident jusqu’à la fin de str1 et la valeur 0
sinon
Exemple:
compar=’expr $1 : $2’
if test $compar = 0
then echo $1 différe de $2
else echo $1 est égale à $2
fi
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 30/35 30 / 35
Programmation Shell
Les fonctions Shell
Une fonction est un ensemble de commandes qui sont
regroupées sous un même nom
Sa syntaxe est la suivante :
Les fonctions sont appelables comme les autres
commandes standards ou fichiers de commandes
Il est possible de leur passer des arguments en utilisant
les notations : $1 , $2..
Une fonction peut retourner une valeur d’état avec le
mot réservé return
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 31/35 31 / 35
Programmation Shell
Les variables
Les variables Bash ne sont pas typées, à l’inverse de
nombreux langages de programmation
⇒ Bash ne regroupe pas ses variables par ”type”
Essentiellement, les variables bash sont des chaı̂nes de
caractères mais, suivant le contexte, Bash autorise des
opérations entières et des comparaisons sur ces variables
Le facteur décisif étant la seule présence de chiffres dans
la variable
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 32/35 32 / 35
Programmation Shell
Les variables
Exemple: Entier ou chaı̂ne?
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 33/35 33 / 35
Programmation Shell
Les variables
Exemple: Entier ou chaı̂ne?
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 34/35 34 / 35
Programmation Shell
Les variables
Exemple: Variables nulles?
Exemple: Variables non déclarées?
Prof. R. HANNANE (FSSM) Systèmes d’exploitation I 35/35 35 / 35