Programmation Shell sous Linux
Prof. M. RIDOUANI
1-Introduction
2-Structure d’un shell script
3-Exécution d’un shell script
4-Les variables: Les variable simples,
Les variable d'environnement,
Les variable spéciales (de contrôle, de position et paramètres)
5- Structure: if - then – else
6- Choix multiples case
7- Tests de conditions: tests sur les fichiers
tests sur chaîne
tests sur valeurs numériques
tests combinés par critères ET OU NON
8- Structure de boucles : Boucle while
Boucle until
Boucle for
break et continue
Lecture du contenu d’un fichier texte
9- Exercices
2
Prof. M. RIDOUANI TP7: Programmation Shell
Introduction
Le shell propose un langage de programmation interprété.
• Son utilité :
– automatisation d’actions
– utilisation de structures plus avancées :
• gestion des variables
• boucles
• Tests
• fonctions
• Caractéristiques :
– C’est un programme écrit en langage shell.
– Il est écrit pour un shell particulier, à la syntaxe bien particulière. Un
shell script ne peut pas être exécuté par un autre shell en général.
– Il se présente sous la forme d'un fichier contenant une ou plusieurs
commandes qui seront exécutées de manière séquentielle.
3
Prof. M. RIDOUANI TP7: Programmation Shell
Structure d’un shell script
• Désignation du shell utilisé
– La première ligne du shell script commence par #! suivi du path du shell utilisé. Elle a une
importance particulière, car elle permet de préciser quel shell va exécuter le script
• #!/bin/sh (Bourne shell)
• #!/bin/bash (Bourne again shell)
• #!/bin/csh (C shell )
• #!/bin/tcsh (Tenex C shell )
• Commentaires
– Un commentaire est introduit par le caractère # et se poursuit jusqu’à la fin de la ligne.
– Un commentaire peut être placé n’importe où.
– La première ligne du script est un commentaire très particulier.
• Code
– Traditionnelles lignes de code respectant la syntaxe du shell utilisé.
4
Prof. M. RIDOUANI TP7: Programmation Shell
Exécution d’un shell script
Par convention, les shell scripts se terminent généralement (pas obligatoirement) par « .sh »
pour le Bourne Shell et le Bourne Again Shell.
On peut rendre un script exécutable de 3 manières :
• en envoyant la commande sh nom_du_script.sh, il suffit dans ce cas que nom_du_script.sh soit
accessible en lecture.
• en envoyant la commande source nom_du_script.sh, mais là il faut que nom_du_script.sh soit
accessible en lecture, en écriture et en exécution.
• en envoyant la commande ./nom_du_script.sh, mais là il faut que nom_du_script.sh soit
accessible en lecture, en écriture et en exécution.
– Avant d’exécuter un script, il faut le rendre exécutable avec `chmod`. Pour ceci tapez dans
le shell la commande qui suit : chmod a+x nom_du_script.sh
5
Prof. M. RIDOUANI TP7: Programmation Shell
•
Les variables: variables simples
Les interpréteurs de commande Linux distinguent
trois types de variables : les variables simples, les
variables d'environnement et les variables
spéciales.
• Assignation de variable
variable=valeur
Il est important de noter qu’avec bash, il ne doit
pas y avoir d’espace avant et après le signe «=»
• Accès et affichage de variable :
L’accès au contenu s’effectue en ajoutant le
caractère $ au début du nom de la variable
$variable
ou par l'expression
${variable}
• Visualisation de toutes les variables définies:
La commande set affiche la liste complète des
variables définies (variables simples ou variables
d'environnement).
• Détruire une variable :
unset variable 6
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: variables simples
• Mécanisme de l’accent grave:
Le shell substitue une commande placée entre des
accents graves ` (backquote) `commande`
ou $ (commande) par la chaîne de caractères
qui serait envoyée sur la sortie standard.
• La commande interne read:
On peut affecter à une ou plusieurs variables des
valeurs lues sur l’entrée standard au moyen de la
commande interne read avec la syntaxe suivante :
read var1 var2 . . . varn.
Le premier mot va dans la première variable, le
deuxième mot va dans la deuxième variable. . .
Tous les mots en trop sont stockés dans la dernière
variable mentionnée.
7
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: variables simples
• Variables de type numérique
Cela n’existe pas en Bourne shell.
Les variables sont de type
caractères. Il est donc impossible
de faire :
var=5
var=$var + 1
• La bonne façon de faire est
d’utiliser la commande « expr »
var=5
var=`expr $var + 1`
ou
var=$(expr $var + 1)
• remarquez l’usage du \ pour
échapper les caractères spéciaux.
t=`expr \( $z + $x \) \* $y`
8
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: variables d'environnement
• Par défaut une variable n'est accessible que depuis
le shell où elle a été définie.
• Les variables d'environnement ont la particularité
d'être connues de toutes les commandes lancées
depuis l'interpréteur de commande courant.
• Pour une variable simple soit visible par les scripts
et autres sous-shell,s il faut la transformer en
variable d’environnement. Pour la transformer
(l’exporter) on utilise la commande export
• Les variables exportées peuvent être modifiées
dans le script, mais ces modifications ne
s'appliquent qu'au script ou au sous-shell.
9
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: variables d'environnement
• Pour afficher toutes les variables
d'environnement définies on utilise la commande
env
• Voici la liste de quelques variables
d’environnement. D’une manière générale, les
variables d'environnement sont notées en
majuscules. :
Variable Description
HOME Répertoire d’utilisateur
(Homedirectory)
USER Nom d’utilisateur (username)
SHELL Chemin (path) du shell utilisé
PATH liste des répertoires séparés
par des « : » dans lesquels
chercher des commandes
LANG La langue utilisé
10
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: Variables spéciales
• Il s’agit de variables accessibles uniquement en
lecture. Grace à ces variables, il est possible, à
l’intérieur d’un fichier de commande, de faire
référence aux arguments de la ligne de
commande.
• Variables de contrôle:
Elles donnent des informations sur les processus
en cours.
Variable Description
$$ PID du shell actif
$! PID du dernier processus
lancé en arrière-plan
$? Code retour de la dernière
commande exécutée. 0 si la
dernière commande s’est
exécutée convenablement,
non nulle sinon.
11
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: Variables spéciales
• Variables de position et paramètres d’un script
Tout processus shell maintient une liste de
chaînes de caractères que l’on peut connaître par
la valeur des variables *,@, #,1, 2, 3, ..., 9. Ce
sont aussi des variables spéciales utilisées lors
d'un passage de paramètres à un script.
Variable Description
$0 Nom du shell script
$1 à $9 Les 9 premiers paramètres
$# Le nombre de paramètres
$* Tous les paramètres passés au
shell script sous la forme de
mots individuels séparés
$@ Tous les paramètres passés au
shell script
12
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: Variables spéciales
• Variables de position $1,$2….$9
Comment accéder à tous les
paramètres au de-là de 11
paramètres?
Soit le script [Link] suivant :
• Solution 1: utiliser le symbole
« {i ème-paramètre } »
13
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: Variables spéciales
• Variables de position
$1,$2….$9
Comment accéder à tous les
paramètres au de-là de 11
paramètres?
• Solution 2: utiliser la
commande « shift »
La commande shift permet de
modifier la structure des
paramètres de position. Un
appel simple décale tous les
paramètres d'une position en
supprimant le premier : $2
devient $1, $3 devient $2 et
ainsi de suite. Le $1 précédent
est perdu. $#, $* et $@ sont
redéfinis en conséquence.
14
Prof. M. RIDOUANI TP7: Programmation Shell
Les variables: Variables spéciales
• Variables de position
$1,$2….$9
Comment accéder à tous les
paramètres au de-là de 11
paramètres?
• Solution 2: utiliser la
commande « shift »
La commande shift permet de
modifier la structure des
paramètres de position. Un
appel simple décale tous les
paramètres d'une position en
supprimant le premier : $2
devient $1, $3 devient $2 et
ainsi de suite. Le $1 précédent
est perdu. $#, $* et $@ sont
redéfinis en conséquence.
15
Prof. M. RIDOUANI TP7: Programmation Shell
Exercices
• Excercice 1:
Écrire un script somme1 qui permet à partir de deux nombres donnés de calculer entrer
par clavier (saisi par l’utilisateur):
– Leur somme
– Leur produit
• Excercice 2:
Écrire un script somme2 qui calcule la somme de 11 nombres passer en arguments
(passer comme paramétres).
16
Prof. M. RIDOUANI TP7: Programmation Shell
1-Introduction
2-Structure d’un shell script
3-Exécution d’un shell script
4-Les variables: Les variable simples,
Les variable d'environnement,
Les variable spéciales (de contrôle, de position et paramètres)
5- Structure: if - then – else
6- Choix multiples case
7- Tests de conditions: tests sur les fichiers
tests sur chaîne
tests sur valeurs numériques
tests combinés par critères ET OU NON
8- Structure de boucles : Boucle while
Boucle until
Boucle for
break et continue
9- Fonctions
17
Prof. M. RIDOUANI TP7: Programmation Shell
Structure: if - then – else
• Syntaxe générale 1 : • Syntaxe générale 2 : • Syntaxe générale 3:
if condition if condition if condition1
then then then
commands1 commands1 commands1
fi else elif condition2
commands2 then
fi commands2
fi
La condition (booléenne) est en général le code de retour d’une commande
Linux/Unix. Le code de retour de la commande (ou la condition) détermine le
test if :
• Code de retour valant zéro :
Le test if est vrai.
• Code de retour non nul :
Le test if est faux.
18
Prof. M. RIDOUANI TP7: Programmation Shell
Structure: if - then – else
• Exemple: du syntaxe 2 :
if condition
then
commands1
else
commands2
fi
19
Prof. M. RIDOUANI TP7: Programmation Shell
Structure: if - then – else
• Autres formes de if : les opérateurs logiques du shell
• ET logique :
command1 && command2
if command1
then
command2
fi
• OU logique :
command1 || command2
if !command1
then
command2
fi
20
Prof. M. RIDOUANI TP7: Programmation Shell
Choix multiples case
• La commande case permet de vérifier le contenu d'une variable ou d'un
résultat de manière multiple.
case chaine-a-tester in
possibilite1) bloc-1-de-commandes ;;
possibilite2) bloc-2-de-commandes ;;
...
possibiliteN) bloc-N-de-commandes ;;
*)action-par-défaut ;;
esac
La possibilité est soit un simple texte, soit composé de caractères spéciaux.
Caractère Rôle
* Chaîne variable (même vide)
? Un seul caractère
[...] Une plage de caractères
[!...] Négation de la plage de caractères
| OU logique
21
Prof. M. RIDOUANI TP7: Programmation Shell
Choix multiples case
• Exemple
22
Prof. M. RIDOUANI TP7: Programmation Shell
Exercices
• Excercice 3:
Écrire un script choix1 qui permet d’afficher:
– oui : si l’utilisateur saisi l’une des réponses (OUI, oui, YES, yes,O,o,Y,y)
– non : si l’utilisateur saisi l’une des réponses (NON,non,NO,no,N,n)
• Excercice 4:
Écrire un script choix2 qui permet d’afficher selon le mot saisi par l’utilisateur:
– commence par une voyelle
– Erreur
23
Prof. M. RIDOUANI TP7: Programmation Shell
Tests de conditions
• Dans de nombreuses structures shell, on teste une condition.
• La commande test permet de réaliser divers tests.
• tests sur les fichiers :
La syntaxe est :
test option nom_objet
Format Description
-d objet Vrai si l’objet existe et est un répertoire.
-f objet Vrai si l’objet existe et est un fichier.
-s objet Vrai si l’objet existe, est un fichier et a une taille supérieure à zéro.
-r objet Vrai si l’objet existe et qu’il a l’ autorisation en lecture.
-w objet Vrai si l’objet existe et qu’il a l’ autorisation en écriture.
-x objet Vrai si l’objet existe et qu’il a l’ autorisation en exécution.
24
Prof. M. RIDOUANI TP7: Programmation Shell
Tests de conditions
• tests sur chaîne :
Format Description
-n string Vrai si la chaine est non vide.
-z string Vrai si la chaine est vide.
s1 = s2 Vrai si les chaines s1 et s2 sont identiques.
s1 != s2 Vrai si les chaines s1 et s2 ne sont pas identiques.
25
Prof. M. RIDOUANI TP7: Programmation Shell
Tests de conditions
• tests sur valeurs numériques :
Format Description
n1 -eq n2 Vrai si les chaines n1 et n2 sont mathématiquement égales.
n1 -ne n2 Vrais si les chaines n1 et n2 ne sont pas mathématiquement égales.
n1 -gt n2 Vrai si la chaine n1 est mathématiquement strictement supérieure à n2.
n1 -ge n2 Vrai si la chaine n1 est mathématiquement supérieure ou égale à n2.
n1 -lt n2 Vrai si la chaine n1 est mathématiquement strictement inférieure à n2.
n1 -le n2 Vrai si la chaine n1 est mathématiquement inférieure ou égale à n2.
26
Prof. M. RIDOUANI TP7: Programmation Shell
Tests de conditions
• tests combinés par critères ET OU NON :
Format Action Description
! expression NOT, NON Logique Vrai si l’expression est
fausse.
expression1 -a expression2 AND, ET logique Vrai si expression1 et
expression2 sont vraies.
expression1 -o expression2 OR, OU logique Vrai si expression1 ou
expression2 est vraie.
Double forme de la commande test :
Forme normal: Forme crochet:
If test "$1" = salam if [ "$1" = salam ]
then then
echo salam echo salam
fi fi
27
Prof. M. RIDOUANI TP7: Programmation Shell
Tests de conditions
Exemple1 : test sur le type de fichier Exemple2 : test sur une chaine de caractère
28
Prof. M. RIDOUANI TP7: Programmation Shell
Exercices
• Excercice 5:
Ecrire un script typeobjet qui dit si un paramètre passé est:
– un fichier
– un répertoire
– n’existe pas
• Excercice 6:
Écrire un script max qui permet de chercher le maximum de deux nombres.
Modifier le script précédent pour qu’il cherche le maximum de trois nombres
29
Prof. M. RIDOUANI TP7: Programmation Shell
1-Introduction
2-Structure d’un shell script
3-Exécution d’un shell script
4-Les variables: Les variable simples,
Les variable d'environnement,
Les variable spéciales (de contrôle, de position et paramètres)
5- Structure: if - then – else
6- Choix multiples case
7- Tests de conditions: tests sur les fichiers
tests sur chaîne
tests sur valeurs numériques
tests combinés par critères ET OU NON
8- Structure de boucles : Boucle while
Boucle until
Boucle for
break et continue
Lecture du contenu d’un fichier texte
9- Exercices
30
Prof. M. RIDOUANI TP7: Programmation Shell
Structure de boucles : while, for, until
• Boucle while: La commande while permet une boucle conditionnelle « tant
while condition que ». Tant que la condition est réalisée, le bloc de commande
do est exécuté. On sort si la condition n'est plus valable.
commands
done
• Boucle until : La commande until permet une boucle conditionnelle « jusqu'à
until condition ». Dès que la condition est réalisée, on sort de la boucle.
do
commands
done
• Boucle for: La boucle for ne se base pas sur une quelconque
for variable in list incrémentation de valeur mais sur une liste de valeurs, de
do fichiers ...
commands La liste représente un certain nombre d'éléments qui seront
done successivement attribuées à variable.
31
Prof. M. RIDOUANI TP7: Programmation Shell
Structure de boucles : while, until, for
Affichage des paramètres: boucle while Affichage des paramètres: boucle until
32
Prof. M. RIDOUANI TP7: Programmation Shell
Structure de boucles : while, until, for
Décrémenter d’un compteur: boucle while Décrémenter d’un compteur: boucle until
33
Prof. M. RIDOUANI TP7: Programmation Shell
Structure de boucles : while, until, for
Affichage des paramètres : boucle for Décrémenter d’un compteur: boucle for
34
Prof. M. RIDOUANI TP7: Programmation Shell
Structure de boucles : break, continue
break ou break n continue ou continue n
Cela permet de sortir prématurément d’un Cela permet de retourner à la boucle
niveau de boucle ou de n niveaux de sans finir le code de la boucle ou de n
boucles imbriquées. niveaux de boucles imbriquées.
35
Prof. M. RIDOUANI TP7: Programmation Shell
Structure de boucles : Lecture du
contenu d’un fichier texte
La commande while est parfois utilisée pour lire le contenu d’un fichier texte. La
lecture s’effectue alors ligne par ligne. Il suffit pour cela :
•de placer une commande interne read dans condition
•de placer les commandes de traitement de la ligne courante dans commands
•de rediriger l’entrée standard de la commande while avec le fichier à lire.
• Forme1: • Forme2: • Forme3:
while read ligne cat fichier-a-lire | while read ligne for i in $(cat fichier-a-lire)
do do do
commands commands commands
done < fichier-a-lire done done
36
Prof. M. RIDOUANI TP7: Programmation Shell
Structure de boucles : Lecture du
contenu d’un fichier texte
Affichage les lignes d’un fichier: Affichage les lignes d’un fichier:
boucle while boucle for
37
Prof. M. RIDOUANI TP7: Programmation Shell
Exercices
• Excercice 7:
Écrire un script somme3 qui calcule la somme de:
N nombres passer en arguments (passer comme paramétres).
N nombres entrer par clavier (saisi par l’utilisateur).
• Excercice 8:
Écrire un script fact qui calcule le factoriel d’un nombre naturel (on utilisant les 3
boucles: while, until, for)
38
Prof. M. RIDOUANI TP7: Programmation Shell
Tout les exercices
• Excercice 1: Écrire un script somme1 qui Excercice 5: Ecrire un script typeobjet qui dit si un
permet à partir de deux nombres donnés de paramètre passé est:
calculer entrer par clavier (saisi par un fichier
l’utilisateur): un répertoire
– Leur somme n’existe pas
– Leur produit
Excercice 6: Écrire un script max qui permet de
• Excercice 2: Écrire un script somme2 qui chercher le maximum de deux nombres.
calcule la somme de 11 nombres passer en Modifier le script précédent pour qu’il
arguments (passer comme paramétres). cherche le maximum de trois nombres
• Excercice 3: Écrire un script choix1 qui permet Excercice 7: Écrire un script somme3 qui calcule la
d’afficher: somme de:
– oui : si l’utilisateur saisi l’une des N nombres passer en arguments (passer comme
réponses (OUI, oui, YES, yes,O,o,Y,y) paramétres).
– non : si l’utilisateur saisi l’une des N nombres entrer par clavier (saisi par l’utilisateur).
réponses (NON,non,NO,no,N,n)
Excercice 8: Écrire un script fact qui calcule le
• Excercice 4: Écrire un script choix2 qui permet factoriel d’un nombre naturel (on utilisant les 3
d’afficher selon le mot saisi par l’utilisateur: boucles: while, until, for)
– commence par une voyelle
– Erreur
39
Prof. M. RIDOUANI TP7: Programmation Shell