Programmation système et réseaux
Chapitre 4: Programmation SHELL sous Linux
ISSAT Sousse, LSI-A2
Dr. Roua Jabla
[email protected] 2024-2025
Plan
Introduction
Initiation d’un script SHELL
Manipulation des variables
Opérations arithmétiques
Structures de contrôle
Tableaux
Fonctions
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 2
Introduction
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 3
Introduction
– SHELL a un double rôle, celui d’interpréteur de commandes mais
aussi un interpréteur d’un langage de programmation,
– Programmation SHELL est une combinaison de commandes au sein
d’un programme dans le but d’automatiser certaines tâches,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 4
Introduction
– Un programme SHELL est appelé « Script »,
– Un script est un fichier texte exécutable,
– Un script gère des variables, des commandes, des fonctions et des
structures de contrôle (boucles, ….),
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 5
Introduction
– Script SHELL:
• Fichier texte exécutable d’extension « .sh »,
• S’exécute comme une commande unique,
• Peut définir et utiliser des variables,
• Peut contenir une suite de commandes SHELL,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 6
Introduction
– Script SHELL:
• Peut contenir des structures conditionnelles et des boucles,
• Peut contenir des fonctions,
• Peut prendre des paramètres d'entrée,
• …
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 7
Initiation d’un script SHELL
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 8
Initiation d’un script SHELL
• Création des scripts
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 9
Création des scripts
– Pour créer un script SHELL, il faut ouvrir l’éditeur gedit en lui
donnant le nom de fichier à créer et son extension « .sh »,
gedit nom_script.sh
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 10
Création des scripts
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 11
Initiation d’un script SHELL
• En-tête des scripts
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 12
En-tête des scripts
– Pour indiquer qu'il s'agit bien d'un script et non pas d'un fichier texte
classique, la première ligne doit toujours commencer par le nom de
l'interpréteur de commandes :
#!/bin/nom-interpréteur
– Cette ligne s’appelle « shebang »,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 13
En-tête des scripts
#!/bin/bash
ou
#!/bin/sh
…
– La ligne « shebang » permet de lancer le bon interpréteur qui doit être
utilisé pour exécuter le script,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 14
Initiation d’un script SHELL
• Commentaires
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 15
Commentaires
– Pour écrire autant de lignes de commentaires que vous voulez, il faut
débuter la ligne par #,
– Le symbole # sert à indiquer une ligne de commentaire dans les
scripts,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 16
Initiation d’un script SHELL
• Exécution des scripts
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 17
Exécution des scripts
– Il existe 3 manières d’exécuter un script SHELL sous Linux,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 18
Exécution des scripts
1. nom-interpréteur nom_script.sh
• Appelle la commande de l'interpréteur désiré (bash, sh, ksh …) suivi du nom du
script,
• Peut-être utiliser avec n’importe quel SHELL disponible sur le système,
→ « bash mon_script.sh » va exécuter le script avec l'interpréteur « bash » même si le shebang spécifie
autre chose,
→ « sh mon_script.sh » va exécuter le script avec l'interpréteur « sh » même si le shebang spécifie autre
chose,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 19
Exécution des scripts
1. nom-interpréteur nom_script.sh
• Lance une copie du SHELL courant et lui fait exécuter le script,
• Peut-être utiliser avec les scripts non exécutables,
• Peut-être utiliser avec les scripts qui ont d'autorisation de lecture seulement,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 20
Exécution des scripts
1. nom-interpréteur nom_script.sh
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 21
Exécution des scripts
1. nom-interpréteur nom_script.sh
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 22
Exécution des scripts
2. . nom_script.sh
• Ne lance pas un nouveau SHELL mais exécute le script dans le SHELL courant,
• Permet de modifier des variables d’environnement du SHELL courant,
• Peut-être utiliser avec les scripts qui n'ont pas d'autorisation d'exécution,
• Peut-être utiliser avec les scripts qui ont d'autorisation de lecture seulement,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 23
Exécution des scripts
2. . nom_script.sh
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 24
Exécution des scripts
3. ./nom_script.sh
• C’est la manière la plus utilisée pour exécuter un script,
• Lance une copie du SHELL actuel et exécute le script,
• Nécessite le(s) droit(s) d’exécution « x » au script en tapant :
chmod [ua]+x nom_script.sh
ou
chmod 7xx nom_script.sh
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 25
Exécution des scripts
3. ./nom_script.sh
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 26
Initiation d’un script SHELL
• Entrées/Sorties
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 27
Commande echo
i. La commande echo dans un script est utilisée pour afficher des messages à
l’écran,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 28
Commande echo
ii. La commande echo est utilisée aussi pour afficher le contenu d’une
variable à l'écran,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 29
Commande echo
iii. La commande echo est utilisée aussi pour afficher une expression
composée de chaines de caractères et de variables,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 30
Commande printf
– La commande printf est utilisée pour afficher des messages à l’écran,
– La syntaxe de la commande printf est:
printf <format> <arguments>
– La commande printf permet d’écrire dans une fenêtre de terminal avec
un contrôle plus fin et plus d’options de formatage que la commande
echo,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 31
Commande printf
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 32
Commande printf
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 33
Commande printf
– Spécificateurs de format
1. \n permet de descendre à une nouvelle ligne « newline »,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 34
Commande printf
– Spécificateurs de format
2. %s permet d’afficher l’argument sous forme d’une chaine de caractères,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 35
Commande printf
– Spécificateurs de format
2. %s permet d’afficher l’argument sous forme d’une chaine de caractères,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 36
Commande printf
– Spécificateurs de format
3. %d permet d’afficher l’argument sous forme d’un entier,
→ Dans cet exemple, %s attend une chaîne de caractères et %d attend un entier,
→ La chaîne ‘first' et l'entier 3 sont des arguments qui remplacent respectivement %s et %d dans la
sortie,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 37
Commande printf
– Spécificateurs de format
3. %d permet d’afficher l’argument sous forme d’un entier,
→ Dans cet exemple, nous avons oublié de fournir un argument pour %d,
→ Par conséquent, printf utilise 0 comme valeur par défaut,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 38
Commande printf
– Spécificateurs de format
3. %d permet d’afficher l’argument sous forme d’un entier,
→ Dans cet exemple, nous avons fourni un argument sous forme de chaîne pour %d,
→ Par conséquent, printf utilise 0 comme valeur par défaut,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 39
Commande printf
– Spécificateurs de format
4. %f permet d’afficher l'argument sous forme de nombre à virgule flottante,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 40
Commande printf
– Spécificateurs de format
4. %f permet d’afficher l'argument sous forme de nombre à virgule flottante,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 41
Commande printf
– Spécificateurs de format
5. La largeur du champ, dans lequel l’argument doit être affiché, peut être fixé
entre les champs % et {s, d, f, …}
• %4s, %5d, %7.4f
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 42
Commande read
– La commande read lit la saisie d’un utilisateur à partir du canal
d’entrée standard (clavier) et stocke ces données dans des variables,
– Lorsque la commande read est traitée, SHELL attend une entrée de la
part de l’utilisateur,
read var
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 43
Commande read
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 44
Initiation d’un script SHELL
• Caractères spéciaux
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 45
Caractères spéciaux
Caractère Correspondance
# Démarre un commentaire
$ Indique le nom d'une variable
\ Échappe les caractères spéciaux
{} Ferme le nom de la variable
; Sépare les commandes sur une même ligne
||, &&, ! OR, AND et NO
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 46
Caractères spéciaux
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 47
Caractères spéciaux
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 48
Caractères spéciaux
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 49
Caractères spéciaux
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 50
Caractères spéciaux
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 51
Manipulation des variables
• Variables
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 52
Variables
– Comme dans n'importe quel langage de programmation, vous pouvez
utiliser des variables dans des scripts SHELL,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 53
Manipulation des variables
• Référencement des variables
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 54
Référencement des variables
– Pour référencer une variable, vous devez ajouter avant son nom le
symbole $
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 55
Référencement des variables
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 56
Manipulation des variables
• Types de variables
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 57
Types de variables
– Il existe deux types de variables que vous pouvez utiliser dans votre
script :
• Variables d'environnement,
• Variables définies par l'utilisateur,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 58
Types de variables
o Variables d’environnement
– Les variables d'environnement sont définies par le SHELL pour votre
usage,
– Les variables d'environnement stockent des configurations qui
peuvent être partagées sous Linux
– Pour savoir les variables d’environnement, vous pouvez utiliser la
commande printenv,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 59
Types de variables
o Variables d’environnement
– Il existe de nombreuses variables d'environnement:
Variable
SHELL Type du SHELL
BASH Nom du SHELL
BASH_VERSION Version du SHELL
PATH Chemin où trouver les commandes
HOSTNAME Nom de la machine
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 60
Types de variables
o Variables d’environnement
– Il existe de nombreuses variables d'environnement:
Variable
USER Utilisateur connecté sur la session
HOME Répertoire de connexion (équivaut à ~)
PWD Répertoire courant
RANDOM Entier aléatoire entre 0 et 32767
→ Toutes les variables d'environnement sont écrites en majuscules, vous pouvez donc déclarer vos
variables en minuscules pour faciliter la différenciation de vos variables des variables
d'environnement,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 61
Types de variables
oVariables d’environnement
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 62
Types de variables
o Variables utilisateur
– Une variable d’utilisateur est comme un espace réservé dans lequel
vous stockez une valeur pour une utilisation ultérieure dans votre
script,
var=valeur
– Une variable peut contenir un nombre, un caractère ou une chaîne de
caractères,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 63
Types de variables
o Variables utilisateur
– Le contenu d’une variable valeur doit être mis entre guillemet s’il
contient des espaces ou des caractères spéciaux,
var="Hello world"
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 64
Types de variables
o Variables utilisateur
– Règles pour les noms de variables:
• Les noms de variables doivent commencer par une lettre ou un trait de
soulignement,
• Le nombre peut être utilisé n'importe où ailleurs,
• Éviter les caractères spéciaux tels que @, #,%, $,
• Sensible à la casse,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 65
Types de variables
o Variables utilisateur
– Exemples
• Noms de variables autorisés
✓ Variable, Variable123, Variable-123, nom-variable, nom_variable, …
• Noms de variables non autorisés
× 1VARIABLE, %NAME, $myvar, VAR@NAME
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 66
Types de variables
o Variables utilisateur
– Pour effacer une variable définie par un utilisateur, vous devez utiliser
la commande unset,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 67
Manipulation des variables
• Guillemets
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 68
Guillemets
– Guillemets dactylographiques "Double Quotation"
• La chaîne enfermée est référencée,
• echo "$my_var" affiche la valeur de my_var,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 69
Guillemets
– Guillemets simples (Apostrophes) ‘Single Quotation’
• La chaîne enfermée est lue littéralement,
• echo ‘$my_var’ affiche $my_var,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 70
Guillemets
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 71
Guillemets
– `Backtick`(Accent Grave)
• La chaîne enfermé est exécutée comme commande,
• echo `pwd` affiche la sortie de la commande pwd,
→ Dans bash, vous pouvez également utiliser $(commande) au lieu de `commande`
pour exécuter une commande dans un script,
→ $(pwd) et `pwd` sont identiques,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 72
Guillemets
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 73
Activité
Consigne
– Créez un script «first_script.sh» qui
i. permet de compter le nombre des répertoires et fichiers dans votre
répertoire courant en utilisant les backticks,
ii. permet de compter le nombre des fichiers ordinaires dans votre répertoire
courant en utilisant $(),
Temps
– 5 min,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 74
Activité
Solution
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 75
Manipulation des variables
• Portée des variables
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 76
Portée des variables
– Par défaut, une variable n’est accessible que depuis le SHELL où elle a
été définie,
– En plus, un script ne partage pas ses variables,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 77
Portée des variables
– La commande export permet d’exporter une variable de manière à ce
que son contenu soit visible par les scripts et les autres SHELLS,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 78
Manipulation des variables
• Accolades
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 79
Accolades
– Les accolades permettent d’entourer une variable pour effectuer
certains traitements lors de l'extraction de sa valeur,
– Les différents traitements peuvent être classés en 4 groupes:
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 80
Accolades
i. 1er groupe
Syntaxe Correspondance
Si « var » est affectée, on l’utilise,
${var:-val} Si « var » n'est pas affectée ou inexistante, elle sera remplacée par « val »
mais sans affectation,
→ val est une "valeur par défaut«
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 81
Accolades
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 82
Accolades
ii. 2ème groupe
Syntaxe Correspondance
Si « var » est affectée, on l’utilise,
${var:=val}
Si « var » n'est pas affectée ou inexistante, elle sera affectée par cette
« val »,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 83
Accolades
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 84
Accolades
iii. 3ème groupe
Syntaxe Correspondance
Si « var » est affectée, « val » prendra sa place,
${var:+val} Si « var » n'est pas affectée ou inexistante, une chaîne vide prend sa
place,
→ ${var:+val} est remplacé par rien,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 85
Accolades
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 86
Accolades
iv. 4ème groupe
Syntaxe Correspondance
Si « var » est affectée, on l’utilise,
${var:?’texte’} Si « var » n'est pas affectée ou inexistante, le script sera interrompu et le
« texte » s'affichera,
→ Si « texte » est absent, un message d'erreur standard sera affiché,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 87
Accolades
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 88
Accolades
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 89
Manipulation des variables
• Extraction de sous-chaînes
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 90
Extraction de sous-chaînes
– Certains traitements peuvent être effectués lors de l’extraction des
valeurs des variables:
• ${#var}: longueur de la chaîne de cette variable,
• ${var:début}: une sous-chaîne de cette variable commençant au caractère
d’indice début,
• ${var:début:n}: une sous-chaîne de cette variable commençant au caractère
d’indice début et de longueur n,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 91
Activité
Consigne
– Complétez le script suivant:
Temps
– 5 min,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 92
Activité
Solution
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 93
Extraction de sous-chaînes
– Certains traitements peuvent être effectués lors de l’extraction des
valeurs des variables:
• ${var/motif/remp}: la première occurrence de « motif » sera remplacée par
« remp »,
• ${var//motif/remp}: toutes les occurrences de « motif » seront remplacées par
« remp »,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 94
Extraction de sous-chaînes
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 95
Opérations arithmétiques
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 96
Opérations arithmétiques
• Variables entières
– Il y a différentes opérations numériques peuvent être effectuées sur les
variables entières:
Opération Opérateur
Addition +
Soustraction -
Multiplication *
Division /
Modulo (mod) % (Reste de la division euclidienne)
Exponentiation **
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 97
Opérations arithmétiques
• Variables entières
– Ces opérations arithmétiques peuvent être effectuées en utilisant:
▪ Les $((···)) ou $[···]
✓ Affecter une variable numérique : $((x=4))
✓ Faire des calculs : $(($a+$b)) ou $[$a*$b]
✓ Evaluer les tests numériques : $(( (x=x-1) < 0 ))
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 98
Opérations arithmétiques
• Variables entières
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 99
Manipulation des variables
• Variables des paramètres
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 100
Variables des paramètres
– Des variables des paramètres, appelées aussi arguments, sont utilisées
pour fournir un moyen de saisir des données dans un script lorsqu'il
est invoqué depuis le SHELL,
– Les variables des paramètres ou les arguments spécifient les données à
utiliser comme valeurs pour les variables dans les scripts,
– Il existe 10 arguments allant de $0 à $9,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 101
Variables des paramètres
Argument Correspondance
# Nombre d’arguments
0 Nom du script
n (1 – 9) Nième arguments
* Tous les arguments au format "$1 $2 $3 ..."
→ Retourne une seule chaîne regroupant tous les paramètres passés au script,
Tous les arguments sous forme d'éléments distincts "$1" "$2" "$3" ...
@ → Retourne autant de chaînes que de paramètres, chacun étant comme encadré par des "..." ,
→ C'est ça qu'il faut utiliser si on fait une boucle,
$ Identifiant du processus (PID) courant
→ PID du script courant
! PID du dernier processus lancé
→ PID du processus le plus récent
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 102
Variables des paramètres
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 103
Variables des paramètres
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 104
Variables des paramètres
– La commande shift permet d’effectuer un décalage de n variables des
paramètres,
shift n
– Un simple appel de shift décale tous les paramètres d’une position en
supprimant le premier: $2 devient $1, $3 devient $2 et etc.,
– $#, $* et $@ sont redéfinis en conséquence,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 105
Variables des paramètres
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 106
Variables des paramètres
– À l’intérieur d’un script, vous pouvez réaffecter les n paramètres ($n),
– La commande set permet de redéfinir le contenu des variables des
paramètres,
set newParam_1 newParam_2 … newParam_n
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 107
Variables des paramètres
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 108
Activité
Consigne
– Créez un script «arguments_script.sh» avec deux arguments qui
i. permet de rechercher la présence d’un mot donné en argument
(arg2) dans tous les fichiers ordinaires du répertoire spécifié en
argument (arg1),
ii. permet aussi de retourner le nombre d’occurrence du mot donné
(arg2),
Temps
– 5 min,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 109
Activité
Solution i.
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 110
Activité
Solution i.
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 111
Activité
Solution ii.
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 112
Structure de contrôle
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 113
Structure de contrôle
– Le langage de script Shell exécute les commandes dans une séquence
similaire aux langages de programmation tel que C,
– Les structures de contrôle peuvent modifier cet ordre séquentiel des
commandes,
– Les structures de contrôle disponibles dans « bash »:
• Conditions : if/then, case
• Boucles : for, while, until
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 114
Structure de contrôle
• Conditions
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 115
Conditions simples
– if/then permet l'exécution d'instruction sous certaines conditions,
if [ condition 1 ]
then
some commands
elif [ condition 2 ]; then
some commands
else
some commands
fi
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 116
Conditions simples
• Conditions sur les chaînes de caractères (string)
Opération Syntaxe bash Correspondance
Égal à (equal to) if [ $s1 == $s2 ] s1 et s2 sont identiques
Pas égal à (not equal to) if [ $s1 != $s2 ] s1 et s2 sont différentes
Longueur nulle (zero length) if [ –z $s1 ] Longueur de s1 est nulle
→ s1 est vide
Longueur non nulle (non zero length) if [ –n $a ] Longueur de s1 est non nulle
→ s1 n’est pas vide
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 117
Conditions simples
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 118
Conditions simples
• Conditions sur les nombres
Opération sur les nombres Syntaxe bash Correspondance
Égal à (equal to) if [ $n1 –eq $n2 ] $n1 = $n2
Pas égal à (not equal to) if [ $n1 –ne $n2 ] $n1 ≠ $n2
Plus grand que (greater than) if [ $n1 –gt $n2 ] $n1 > $n2
Plus grand ou égal à if [ $n1 –ge $n2 ] $n1 >= $n2
Inférieur à (less than) if [ $n1 –lt $n2 ] $n1 < $n2
Inférieur ou égal à if [ $n1 –le $n2 ] $n1 =< $n2
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 119
Conditions simples
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 120
Conditions simples
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 121
Conditions simples
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 122
Conditions simples
• Conditions sur les fichiers
Opération sur les fichiers Syntaxe bash
Si nom est un fichier ou le répertoire existant if [ –e nom ]
Si nom est un fichier ordinaire if [ –f nom ]
Si nom est un répertoire if [ –d nom ]
Si nom est un lien symbolique if [ –L nom ]
Si nom n'est pas de taille nulle ( non vide) if [ –s nom ]
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 123
Conditions simples
• Conditions sur les fichiers
Opération sur les fichiers Syntaxe bash
Si nom est accessible en lecture if [ –r nom ]
Si nom est accessible en écriture if [ –w nom ]
Si nom est un fichier exécutable ou un répertoire accessible if [ –x nom ]
Si nom1 et nom2 existent et si nom1 et nom2 sont liés if [ nom1 -ef nom2 ]
Si nom1 et nom2 existent et si nom1 est plus récent que nom2 if [ nom1 -nt nom2 ]
Si nom1 et nom2 existent et si nom1 est plus ancien que nom2 if [ nom1 -ot nom2 ]
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 124
Conditions simples
• Conditions par opérateurs logiques
Opérateur Syntaxe bash
NOT if [ ! –e nom ]
AND if [ $a –eq $b ] && [ $x –gt $y ]
OR if [[ $a –eq $b || $a –gt $b ]]
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 125
Conditions simples
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 126
Conditions simples
• Exemple
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 127
Conditions multiples
– case est une structure de contrôle utilisée lorsqu'une décision doit
être prise contre plusieurs choix,
– case est une bonne alternative à l'instruction if/then,
– case aide à simplifier l’instruction if/then imbriquée,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 128
Conditions multiples
case value in
"condition1")
cmd1;;
"condition2")
cmd2;;
…
…
esac
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 129
Conditions multiples
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 130
Structures de contrôle
• Boucles
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 131
Boucles
– Une boucle est un bloc de code qui itère une liste de commandes tant
que la condition de contrôle de la boucle est vraie,
– Les structures de boucles disponibles dans « bash »: for, while and
until,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 132
Boucles
• Boucle for
– Pour la boucle for, il ne s’agit pas de fixer une valeur de départ et une
valeur de fin contrôlant le nombre d’itérations mais d’une répétition
d’un traitement pour des valeurs différentes d’une variable,
for var in list
do
some commands
done
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 133
Boucles
• Boucle for
– La boucle for permet de parcourir par exemple:
• Les variables des paramètres
for param in “$@”
do
some commands
done
• Les fichiers
for file in *.txt
do
some commands
done
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 134
Boucles
• Boucle for
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 135
Boucles
• Boucle for
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 136
Boucles
• Boucle while
– La boucle while teste une condition au sommet d'une boucle et
continue d’exécuter une suite de commandes tant que cette condition
est vraie,
while [ conditions ]
do
some commands
done
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 137
Boucles
• Boucle while
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 138
Boucles
• Boucle until
– La boucle until teste une condition au sommet d’une boucle et continue à
répéter une séquence de commandes tant que cette condition est fausse, c'est
à dire quelle fonctionne à l'inverse de la boucle while,
until [ condition is true ]
do
some commands
done
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 139
Boucles
• Boucle until
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 140
Structures de contrôle
• Contrôle de boucles
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 141
Contrôle de boucles
• Débranchement « break »
– Il est possible de sortir d’une boucle sans effectuer toutes les itérations
prévues en utilisant la commande break,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 142
Contrôle de boucles
• Débranchement « continue »
– Il est possible de forcer le passage immédiat à l'itération suivante dans
une boucle en utilisant la commande continue,
– Contrairement à la commande break, la commande continue permet
de sauter vers la fin d'une boucle sans la quitter forcément,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 143
Contrôle de boucles
• Débranchement continue
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 144
Activité
Consigne
– Écrivez le script «fileCheck_script.sh» qui permet
d’identifier le type du fichier (ordinaire ou symbolique)
passé en paramètre,
Indication:
i. Proposez deux manières différentes,
ii. Pensez à vérifier la présence de paramètre,
iii. Pensez à vérifier l’existence du fichier passé en paramètre,
Temps
– 10 min,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 145
Activité
Solution 1
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 146
Activité
Solution 2
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 147
Tableaux
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 148
Tableaux
– Deux types de tableaux sont prises en charge:
• Les tableaux indicés (classiques)
→ Éléments indexés par une valeur numérique,
• Les tableaux associatifs
→ Éléments indexés par une chaîne de caractères,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 149
Tableaux
• Déclaration des tableaux
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 150
Déclaration des tableaux
– Un tableau peut être crée de façon explicite en utilisant declare, suivi de
l’option –a pour un tableau indicé ou –A pour un tableau associatif,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 151
Déclaration des tableaux
– La déclaration d’un tableau indicé peut se faire simplement par initialisation, en
fournissant ses éléments entre parenthèses:
declare –a tableauIndicé=("un" "deux" "trois")
– Les indices sont ici assignés automatiquement, en commençant par « 0 » (zéro),
– Un tableau indicé peut être initialiser avec des indices imposés:
declare –a tableauIndicé=([1]="un" [2]="deux" [3]="trois")
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 152
Déclaration des tableaux
– La déclaration d’un tableau associatif peut se faire de la même façon,
mais un indice (clé) doit être précisé pour chaque élément:
declare –A tableauAssociatif=([‘one’]="un" [‘two’]="deux" [‘three’]="trois")
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 153
Tableaux
• Affichage et indexation des tableaux
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 154
Affichage et indexation des tableaux
• Affichage
– L’affichage d’un tableau se fait avec la syntaxe:
${tab[*]}
ou
${tab[@]}
→ La différence entre * et @ est identique à celle entre les variables des paramètres $* et
$@,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 155
Affichage et indexation des tableaux
• Affichage
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 156
Affichage et indexation des tableaux
• Affichage
– Il est possible d’obtenir la liste des indices (clés) d’un tableau à l’aide
de la syntaxe:
${!tab[@]}
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 157
Affichage et indexation des tableaux
• Affichage
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 158
Affichage et indexation des tableaux
• Affichage
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 159
Affichage et indexation des tableaux
• Indexation
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 160
Tableaux
• Longueur et traversée des tableaux
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 161
Longueur et traversée des tableaux
– Il est possible de savoir la longueur d’un tableau à l’aide de la syntaxe:
${#tab[*]}
ou
${#tab[@]}
– Il est possible de traverser un tableau à l’aide de la syntaxe:
for i in ${tab[@]}
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 162
Tableaux
• Modification d’un élément
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 163
Modification d’un élément
– L’initialisation d’un élément du tableau peut se faire de la manière
suivante:
tab[indice]=valeur
– Si le tableau tab n’existe pas, il sera créé comme un tableau indicé par
défaut,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 164
Modification d’un élément
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 165
Modification d’un élément
– La suppression d’un élément du tableau peut se faire en utilisant la
commande unset:
unset tab[indice]
– La commande unset permet aussi de détruire tout un tableau, en lui
passant son nom, nom[*] ou nom[@]
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 166
Fonctions
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 167
Fonctions
– Une fonction se comporte comme un script,
– Les deux ont une entrée standard et une sortie standard,
– La façon d’accéder aux paramètres sont les mêmes,
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 168
Fonction
• Déclaration des fonctions
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 169
Déclaration des fonctions
– La déclaration des fonctions dans un script se fait selon les 2 syntaxes suivantes:
function Nom_Func Nom_Func ()
{ {
instructions … instructions …
} }
– L’appel de la fonction se fait avec cette syntaxe:
Nom_Func params
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 170
Fonction
• Paramètres des fonctions
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 171
Paramètres des fonctions
– Des paramètres peuvent être transmis au moment de l'appel de la
fonction,
– Tous les paramètres passés lors de l’appel seront utilisés pour la
lecture de ces valeurs,
Correspondance
@ Le tableau de tous les paramètres
* Une chaine de caractères qui contient tous les paramètres
# Le nombre de paramètres
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 172
Paramètres des fonctions
function Nom_Func {
for i in “$@”
do
echo $i
done
}
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 173
Paramètres des fonctions
– Accéder aux différents paramètres passés lors de l’appel par leur
numéro:
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 174
Fonction
• Variables des fonctions
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 175
Variables des fonctions
– Par défaut, toutes les variables sont globales dans le script,
– Pour déclarer une variable locale, vous pouvez utiliser local,
local nom_var=valeur
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 176
Variables des fonctions
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 177
Fin
Dr. Roua Jabla LSI-A2 Programmation système et réseaux 178