12/12/2024
PLAN
Programmation Shell
Université Aube Nouvelle
Année 2024-2025 / IT2, ELN2
Mme KAM \SOGLI Y. Evelyne
12/12/2024 Y. Evelyne KAM/SOGLI 1
PLAN (1/3)
I. Introduction
I.1. Rappels
I.2 Script et Langage de script
[Link] shell
[Link]
[Link] différents shells Unix
[Link] et inconvénients de la programmation shell
[Link] D’UN SHELL
I.4. Environnement pour développer en Shell
II. Les scripts
II.1 Entête d’un script Shell
[Link] commentaires
[Link] commande echo
Exercice d’application
II.4. variables
[Link]
[Link] Directe
[Link] par lecture
II.4.4. Utiliser une variable
II.4.5. Récupérer l’exécution d’une commande dans une variable
II.4.6. Suppression et protection
[Link] variables d’environnement
12/12/2024 Y. Evelyne KAM/SOGLI 2
1
12/12/2024
PLAN (2/3)
[Link]ètres de position
II.5.1. Description
II.5.2 redéfinition des paramètres
II.5.3 Réorganisation des paramètres
[Link] de retour d’un script Shell et redirections
II.6.1. Code de retour d’un script Shell
II.6.2Redirections
II.6.2.1 En sortie
II.6.2.2 En entrée
II.6.2.3Les canaux standards
II.6.2.4 Filtre : définition
II.6.2.5 Pipelines / tubes
12/12/2024 Y. Evelyne KAM/SOGLI 3
PLAN (3/3)
[Link] Les structures de contrôles
[Link] commande test
[Link] test if
[Link] test case
II.8. Les structures de boucle
II.8.1LA BOUCLE FOR
II.8.2. LA BOUCLE WHILE :
II.8.3. LA BOUCLE UNTIL :
II.9. les tableaux
II.10. Fonctions
12/12/2024 Y. Evelyne KAM/SOGLI 4
2
12/12/2024
I. Introduction
I.1. Rappels
Depuis le début du cours d’Environnement Informatique, vous
avez appris à utiliser un interprète de commandes (ou Shell en
anglais) qui permet d’interagir avec la machine via des
commandes. L’exécution de commandes vous a permis de
consulter ou modifier l’état du système (par exemple, la
commande ls pour consulter la liste des fichiers dans un répertoire
ou la commande cp ou rm respectivement pour copier ou effacer
un fichier).
Une utilisation avancée de ce système de commandes consiste à
combiner ces commandes en les exécutant les unes à la suite des
autres pour automatiser certains traitements ou encore en
combinant l’exécution de plusieurs commandes en redirigeant le
résultat d’une commande comme l’entrée à traiter de la
commande suivante.
12/12/2024 Y. Evelyne KAM/SOGLI 5
I. Introduction
I.1. Rappels
12/12/2024 Y. Evelyne KAM/SOGLI 6
3
12/12/2024
I. Introduction
I.1. Rappels
12/12/2024 Y. Evelyne KAM/SOGLI 7
I. Introduction
I.1. Rappels
12/12/2024 Y. Evelyne KAM/SOGLI 8
4
12/12/2024
I. Introduction
I.1. Rappels
12/12/2024 Y. Evelyne KAM/SOGLI 9
I. Introduction
I.1. Rappels
12/12/2024 Y. Evelyne KAM/SOGLI 10
5
12/12/2024
I. Introduction
I.1. Rappels
12/12/2024 Y. Evelyne KAM/SOGLI 11
I. Introduction
I.1. Rappels
12/12/2024 Y. Evelyne KAM/SOGLI 12
6
12/12/2024
I. Introduction
I.2 Script et Langage de script
La programmation Shell consiste à combiner des commandes au
sein d’un script dans le but d’automatiser certaines tâches qui
peuvent être réalisées par l’enchainement de commandes Unix de
base.
Les scripts sont des programmes en langages interprétés : ce sont
des fichiers écrits dans des langages qui sont convertis en
instructions directement exécutables par la machine au moment
de son exécution. On appelle ces langages, langages de script.
Un script Shell est un fichier exécutable, dont le nom comporte
parfois l’extension .sh (ce n’est pas une obligation, mais nous
utiliserons ce nommage pour identifier rapidement les scripts que
nous ferons).
12/12/2024 Y. Evelyne KAM/SOGLI 13
I. Introduction - [Link] SHELL
[Link]ésentation
Le Shell est un interpréteur de commande. Il permet d'accéder aux fonctionnalités
internes du système d'exploitation. Il date de l'époque d'Unix où le seul moyen de
communiquer avec la machine était d'écrire des lignes de texte au clavier dans un
terminal, celui-ci exécutant les commandes de l'utilisateur et affichant les résultats. De
par sa définition et l'époque de sa création le shell est léger et rapide et a un accès
privilégié au noyau Linux (aussi appelé Kernel).
En bref:
L’interprète de commandes (shell) permet d’interagir avec le système
Exécution de commandes (modification / consultation de l’etat du système)
Utilisation avancée : combinaison de commandes par exemple en redirigeant les
entrées/sorties
Programmation shell : combinaison de commandes au sein d’un script dans le but
d’automatiser certains tâches
Un Script shell correspond à un fichier exécutable d’extension .sh et debutant par :
#!/bin/sh
12/12/2024 Y. Evelyne KAM/SOGLI 14
7
12/12/2024
I. Introduction - [Link] SHELL
[Link] différents shells Unix (1/2)
Tout au fil des années de multiples types de shells on été crées:
le /bin/sh: Bourne Shell
le /bin/bash: Bourne Again SHell
le /bin/csh C shell
le /bin/ksh Korn shell
le /bin/tcsh C shell amélioré
Chaque shell hérite de la grande majorité des fonctionnalités de
ses ancêtres.
12/12/2024 Y. Evelyne KAM/SOGLI 15
I. Introduction - [Link] SHELL
[Link] différents shells Unix (2/2)
HHH
12/12/2024 Y. Evelyne KAM/SOGLI 16
8
12/12/2024
I. Introduction - [Link] SHELL
[Link] et inconvénients de la programmation shell
Les avantages de la programmation shell sont les suivants:
- le shell est facile à mettre en œuvre et installé d’office sous tout système GNU/Linux (pas
besoin d'installer un autre langage sur votre système).
- le langage manipule essentiellement des chaînes de caractères : pas de structures
complexes, pointeurs, etc...
- le shell est adapté au prototypage rapide: exécutions d’instructions systèmes fiables et
rapides.
- le langage est un langage « GLU » : exécuter et agglomérer des composants divers écrits
dans d’autres langages.
Les inconvénients bien que peu nombreux sont aussi au rendez-vous:
- le nombre de commandes et la documentation difficile d'accès et de compréhension
pour le novice.
- les messages d'erreurs difficiles à exploiter, ce qui rend la création des scripts long.
12/12/2024 Y. Evelyne KAM/SOGLI 17
I. Introduction - [Link] SHELL
[Link] D’UN SHELL
Lors de l’ouverture d’une session, le shell exécute des fichiers de configuration, qui
peuvent contenir des commandes quelconques et sont généralement utilisées pour définir
des variables d’environnement et des alias.
Exemple :
Chaque utilisateur peut ajouter des commandes shell au profil personnel ~/.bash_profile.
On peut par exemple ajouter les lignes suivantes :
soufiene@linuxpc $ nano .bash_profile
clear
salut = ”Bonjour $USER ! ”
# $USER contient le nom de connexion
echo $salut
echo “Nous somme le $(date)”
# $(..) permet d’obtenir le résultat de l’exécution de la commande incluse
Lors de l’ouverture de session, un message s’affichera :
Bonjour user1
Salut
Nous somme le mardi 02 decembre 2014, 11:34:08
12/12/2024 Y. Evelyne KAM/SOGLI 18
9
12/12/2024
I. Introduction
I.4. Environnement pour développer en Shell
Pour écrire des programmes Shell, pas besoin d’environnement de
développement très évolué, un simple éditeur de texte suffit. Vous
pourrez donc utiliser gedit pour créer vos premiers scripts ou tout
autre éditeur de texte équivalent (mais pas de traitement de texte
pour créer de tels fichiers, qui ne sont pas adaptés).
12/12/2024 Y. Evelyne KAM/SOGLI 19
II. Scripts
II.1 Entête d’un script Shell (1/3)
Un script Shell est donc un fichier texte qui doit toujours
commencer par une ligne contenant le nom du Shell avec lequel
lire la suite du script. Si vous souhaitez développer un script bash,
votre fichier devra donc débuter par :
#!/bin/bash
N’oubliez pas que votre fichier doit aussi être exécutable (au sens
propriété des fichiers, modifiable avec la commande chmod).
$ chmod u+x monscript
$ ./monscript (Pour l'exécuter) ,
Rappelons, que bash est principalement une évolution de sh.
Ainsi, il est possible, au stade de vos connaissances en
programmation Shell, d'écrire en première ligne :
#!/bin/sh
12/12/2024 Y. Evelyne KAM/SOGLI 20
10
12/12/2024
II. Scripts
II.1. Entête d’un script Shell (2/3)
Dans le cas ci-dessus, on fait appel au programme sh et
non au bash pour exécuter les commandes. C'est parfois
préférable pour que votre script soit standard et qu'il
fonctionne ainsi sur toutes les plateformes de type Unix
qui parfois, ne disposent pas de Bash (ça reste assez
rare tout de même).
Vous modifierez votre entête en fonction de l’endroit où
est installé le Shell pour lequel vous écrivez le script, si
vous choisissez ksh ou zsh par exemple.
12/12/2024 Y. Evelyne KAM/SOGLI 21
II. Scripts
II.1. Entête d’un script Shell (3/3)
Exemple
#!/bin/bash
# script [Link]
echo Bonjour $USER
echo "Aujourdhui nous sommes le $(date)"
echo "et il va falloir se mettre au Shell "
12/12/2024 Y. Evelyne KAM/SOGLI 22
11
12/12/2024
II. Scripts
[Link] commentaires
Toute ligne qui commence par le caractère # est considéré
comme un commentaire (ce qui est écrit n’est pas interprété par
le Shell) jusqu’à la fin de la ligne. Pour que le caractère # soit
reconnu en tant que début de commentaire, il ne doit pas être
inséré à l’intérieur d’un mot ou terminer un mot.
Attention à la première ligne de votre script qui commence par «
#! » et non seulement par « # » et qui est commentaire
spécifique qui indique le nom du Shell à utiliser pour interpréter
les commandes.
12/12/2024 Y. Evelyne KAM/SOGLI 23
II. Scripts
[Link] commande echo
La commande de base pour afficher un message est la
commande echo :
$ echo Bonjour tout le monde
Bonjour tout le monde
Dans cet exemple, la commande echo est appelée avec 4
arguments. L’affichage ne conserve alors pas les espaces. Pour
conserver ceux-ci, on utilisera les guillemets " ".
$ echo "Bonjour tout le monde"
Bonjour tout le monde
On dit que les espaces ont été protégés de l’interprétation du
Shell. L’option -n à la commande echo permet de ne pas faire le
retour à la ligne à la fin de l’affichage.
12/12/2024 Y. Evelyne KAM/SOGLI 24
12
12/12/2024
II. Scripts
[Link] commande echo
note : le texte sera suivi automatiquement par un saut de ligne.
On peut utiliser des caractères spéciaux habituels, qui seront
interprétés seulement avec l’option -e.
Rappel des caractères spéciaux :
\n (saut ligne),
\b retour arrière),
\t (tabulation),
\a (alarme),
\c (fin sans saut de ligne)
12/12/2024 Y. Evelyne KAM/SOGLI 25
II. Scripts
[Link] commande echo
Exemple
echo « Bonjour \nMesdames ! »
echo -e « Bonjour \nMesdames ! »
echo -e « Bonjour \nMesdames, \Mesdemoiselles et Messieurs
\c »
Pour lire une valeur au clavier et la ranger dans une variable, on
utilise ‘read’.
Et ce de la facon suivante :
read var1 var2 …
Voici un exemple
echo « Saisissez votre civilité »
read civil
echo « Saisissez a la suite vos prénom et votre nom »
read prenom nom
echo « Bonjour $civil $prenom $nom »
12/12/2024 Y. Evelyne KAM/SOGLI 26
13
12/12/2024
II. Scripts
[Link] commande echo
Exercice d’application
1) créer un répertoire TP sur c
2) créer un fichier ([Link]) dans le répertoire TP
3) Editer le contenu avec le script suivant:
#!/bin/bash
Salut=«Bonjour $(users)»
echo $Salut
echo « Nous sommes le $(date)»
4) Attribuer le droit d’exécution
5) Exécuter le script [Link]
12/12/2024 Y. Evelyne KAM/SOGLI 27
II. Scripts –II-4-Variables
II.4.1Definition (1/2)
Une variable est identifiée par un nom, c'est-à-dire une suite de lettres, de
chiffres ou du caractère souligné et ne commençant pas par un chiffre. Les
lettres majuscules et minuscules sont différenciées.
Les variables peuvent être classées en trois groupes :
− les variables u lisateur (ex : a, my_var ; ...)
− les variables prédéfinies du Shell (ex : PS1, PATH, REPLY, IFS, USER,
HOSTNAME...)
− les variables prédéfinies de commandes Unix (ex : TERM).
12/12/2024 Y. Evelyne KAM/SOGLI 28
14
12/12/2024
II. Scripts –II-4-Variables
II.4.1Definition (2/2)
En général, mais c’est une convention et pas une obligation, les noms des
variables utilisateur sont en lettres minuscules tandis que les noms des
variables prédéfinies (du Shell ou de commandes Unix) sont en majuscules.
L’utilisateur peut affecter une valeur à une variable en utilisant :
− l’opérateur d’affecta on simple : =
− l’opérateur d’affecta on du résultat d’un calcul en er : let
− la commande interne : read
12/12/2024 Y. Evelyne KAM/SOGLI 29
II. Scripts –II-4-Variables
II.4.2. Affectation directe
Il est impératif que le nom de la variable, le symbole = et la valeur à
affecter, ne forment qu’une seule chaîne de caractères. En d’autres termes,
il ne peut y avoir d’espaces entre le nom, le symbole = et la valeur que l’on
affecte à la variable.
$ a=12 $ d=$a+$b
$ b=34
$ echo $d
$ c=a+b
$ echo $c 12+34
a+b $ let e=$a+$b
$ echo $d
46
12/12/2024 Y. Evelyne KAM/SOGLI 30
15
12/12/2024
II. Scripts –II-4-Variables
[Link] par lecture
La commande read permet de récupérer une saisie faite par l’utilisateur au clavier.
$ echo –n " Entrez votre prenom : "
$ read prenom
L’option –p de read affiche une chaîne d’appel avant d’effectuer la lecture. La commande
précédente est donc équivalente aux deux commandes suivantes :
$ read -p "Entrez votre prenom : " prenom
Entrez votre prenom : <l’utilisateur tape son prénom puis sur la touche Entrée>
12/12/2024 Y. Evelyne KAM/SOGLI 31
II. Scripts –II-4-Variables
II.4.4. Utiliser une variable
Pour récupérer le contenu d’une variable on préfixe son nom par le symbole $
$ echo $prenom
<affiche le prénom saisi par l’utilisateur lors de la commande précédente>
Mais certaines fois, il peut y avoir une ambigüité entre un nom de variable et un message
que l’on veut concaténer : dans ce cas, on ajoute des accolades autour du nom de la
[Link] exemple, si on a les variables x et x1 qui sont initialisées aux valeurs
suivantes :
$ x=bon
$ x1=jour
$ echo $x$x1
bonjour
$ echo ${x}1
bon1
12/12/2024 Y. Evelyne KAM/SOGLI 32
16
12/12/2024
II. Scripts –II-4-Variables
II.4.5. Récupérer l’exécution d’une commande dans une variable
Si vous utilisez la commande date sous Unix, elle vous imprime sur la console la date à
laquelle vous venez d’exécuter cette commande (donc la date et l’heure du moment de
l’exécution). Il peut être intéressant de stocker cette valeur dans une variable. Il faut alors
utiliser la syntaxe suivante avec le symbole ` (que l’on obtient sur un clavier français avec
la combinaison de touche Alt-Gr et la touche 7).
$ date
<affiche la date courante>
$ d=`date`
<met le résultat de la commande date dans la variable d>
Comparez le contenu de la variable d et si vous le comparez au résultat obtenu à l’exécution
précédente.
Une autre façon de l’écrire est d’utiliser la notation $(cmd) qui est équivalente à la notation
`cmd`.
$ d=$(date)
<met le résultat de la commande date dans la variable d>
$ y=$(date +"%Y")
12/12/2024 Y. Evelyne KAM/SOGLI 33
II. Scripts –II-4-Variables
II.4.6. SUPPRESSION ET PROTECTION
On supprime une variable avec la commande unset. On peut protéger une variable en
écriture et contre sa suppression avec la commande readonly. Une variable en lecture
seule même vide est figée. Il n'existe aucun moyen de la replacer en écriture et de la
supprimer, sauf à quitter le shell.
$ a=Jules
$ b=Cesar
$ echo $a $b
Jules Cesar
$ unset b
$ echo $a $b
Jules
$ readonly a
$ a=Neron
a: is read only
$ unset a
12/12/2024 Y. Evelyne KAM/SOGLI 34
17
12/12/2024
II. Scripts –II-4-Variables
Ecrire un script qui demande votre nom et prénom
puis affiche un message de bienvenue à la
personne .
Entrer la longueur et la largeur d’un rectangle, puis
calculer et afficher son périmètre
Entrer un nom de fichier au clavier
Créer le fichier
Entrer un nom de fichier
Renommer un fichier
Supprimer le fichier
12/12/2024 Y. Evelyne KAM/SOGLI 35
II. Scripts –II-4-Variables
[Link] VARIABLES D’ENVIRONNEMENT
Le système UNIX défini pour chaque processus une liste de variables d’environnement,
qui permettent de définir certains paramètres. Parmi ces variables :
HOME : contient le chemin absolu du répertoire de connexion de l’utilisateur
LOGNAME : contient le nom de connexion de l’utilisateur
PATH : contient la liste des répertoires contenant des exécutables séparés par ‘ :’. Ces
répertoires seront parcourus par ordre à la recherche d’une commande externe
SHELL : contient le chemin d’accès absolu des fichiers programmes du shell
PS1: Contient le prompt caractère du shell. C’est le caractère que shell affiche quand il
attend une commande. Sur la plupart de systèmes c’est soit “$”, soit “%”. Si vous en
voulez un autre, il suffit d’affecter cette variable avec la chaîne que vous voulez.
EDITOR : l'éditeur de texte par défaut qui s'ouvre lorsque cela est nécessaire ;
PWD : le dossier dans lequel vous vous trouvez ;
OLDPWD : le dossier dans lequel vous vous trouviez auparavant.
les variables USER et HOSTNAME qui contiennent respectivement le nom de
l’utilisateur connecté et le nom de la machine.
Remarque :
La commande env permet d’afficher l’ensemble des variables d’environnement pour le
shell actif.
Notez que les noms de ces variables sont, par convention, écrits en majuscules.
12/12/2024 Y. Evelyne KAM/SOGLI 36
18
12/12/2024
II. Scripts –II-4-Variables
[Link] VARIABLES SPÉCIALES
? : valeur de retour de la dernière commande exécutée
$$ : numéro du processus (PID) du shell actif
$ ! : numéro du processus (PID) du dernier processus lancé en arrière plan
$0 : nom de procédure de commande
$1….$9 : valeur de nième paramètre
$# : nombre de paramètre transmis à l’appel
$* : liste de tous les paramètres $1……$9
$@ : liste des paramètres sous la forme “$1“, “$2“,…., “$9“
Remarque :
La commande set sans paramètre permet d’afficher la liste des variables définies
dans le shell. Elle ne montre pas seulement les variables définies par l’utilisateur
mais aussi les variables systèmes. Elle visualise la variable ainsi que son contenu.
12/12/2024 Y. Evelyne KAM/SOGLI 37
II. Scripts –II-5-Paramètres de position
Les paramètres de position sont aussi des variables spéciales
utilisées lors d'un passage de paramètres à un script.
II.5.1. Description (1/4)
Variable Contenu
$0 Nom de la commande (du script)
$1-9 $1,$2,$3... Les neuf premiers paramètres passés au script
$# Nombre total de paramètres passés au script
$* Liste de tous les paramètres au format "$1 $2 $3 ..."
$@ Liste des paramètres sous forme d'éléments distincts "$1" "$2"
"$3" ...
12/12/2024 Y. Evelyne KAM/SOGLI 38
19
12/12/2024
II. Scripts –II-5-Paramètres de position
II.5.1. Description (2/4)
Essayons :
#!/bin/bash
echo "Vous avez lancé $0, il y a $# paramètres"
echo "Le paramètre 1 est $1 "
$ ./[Link] param1 param2 param3
Vous avez lancé ./[Link], il y a 3 paramètres
Le paramètre 1 est param1
12/12/2024 Y. Evelyne KAM/SOGLI 39
II. Scripts –II-5-Paramètres de position
II.5.1. Description (3/4)
Créer un fichier [Link] avec le contenu suivant :
#!/bin/sh
echo "Nom : $0"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3"
echo "Liste : $*"
echo "Elements : $@"
$ [Link] riri fifi loulou
Nom : ./[Link]
Nombre de parametres : 3
Parametres : 1=riri 2=fifi 3=loulou
Liste : riri fifi loulou
Elements : riri fifi loulou
12/12/2024 Y. Evelyne KAM/SOGLI 40
20
12/12/2024
II. Scripts –II-5-Paramètres de position
II.5.1. Description (4/4)
La différence entre $@ et $* ne saute pas aux yeux.
Reprenons l'exemple précédent avec une petite modification :
$ [Link] riri "fifi loulou"
Nom : ./[Link]
Nombre de parametres : 2
Parametres : 1=riri 2=fifi loulou
Liste : riri fifi loulou
Elements : riri fifi loulou
Cette fois-ci il n'y a que deux paramètres de passés. Pourtant les listes semblent
visuellement identiques. En fait si la première contient bien
"riri fifi loulou"
La deuxième contient
"riri" "fifi loulou"
Soit bien deux éléments. Dans les premiers exemple nous avions
"riri" "fifi" "loulou"
12/12/2024 Y. Evelyne KAM/SOGLI 41
II. Scripts –II-5-Paramètres de position
II.5.2 redéfinition des paramètres (1/2)
Outre le fait de lister les variables, la commande set permet de redéfinir le
contenu des variables de position. Avec set valeur1 valeur2 valeur3 ...
$1 prendra comme contenu valeur1, $2 valeur2 et ainsi de suite.
$ cat [Link]
#!/bin/sh
echo "Avant :"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
set alfred oscar romeo zoulou
echo "apres set alfred oscar romeo zoulou"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
$ ./[Link] riri fifi loulou donald picsou
12/12/2024 Y. Evelyne KAM/SOGLI 42
21
12/12/2024
II. Scripts –II-5-Paramètres de position
II.5.2 redéfinition des paramètres (2/2)
Avant :
Nombre de parametres : 5
Parametres : 1=riri 2=fifi 3=loulou 4=donald
Liste : riri fifi loulou donald picsou
apres set alfred oscar romeo zoulou
Nombre de parametres : 4
Parametres : 1=alfred 2=oscar 3=romeo 4=zoulou
Liste : alfred oscar romeo zoulou
12/12/2024 Y. Evelyne KAM/SOGLI 43
II. Scripts –II-5-Paramètres de position
II.5.3 Réorganisation des paramètres (1/3)
La commande shift est la dernière commande permettant 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 originel
disparaît. $#, $* et $@ sont redéfinis en
conséquence.
La commande shift suivie d'une valeur n effectue un décalage de
n éléments. Ainsi avec
shift 4
$5 devient $1, $6 devient $2, ...
$ cat [Link]
12/12/2024 Y. Evelyne KAM/SOGLI 44
22
12/12/2024
II. Scripts –II-5-Paramètres de position
II.5.3 Réorganisation des paramètres (2/3)
Reprenons notre script :
#!/bin/bash
echo "Le paramètre 1 est $1"
shift
echo "Le paramètre 1 est maintenant $1"
$ ./[Link] param1 param2 param3
Le paramètre 1 est param1
Le paramètre 1 est maintenant param2
Comme vous le voyez, les paramètres ont été décalés : $1
correspond après le shift au second paramètre, $2 au troisième
paramètre, etc.
Bien sûr, shift est généralement utilisé dans une boucle qui
permet de traiter les paramètres un par un.
12/12/2024 Y. Evelyne KAM/SOGLI 45
II. Scripts –II-5-Paramètres de position
II.5.3 Réorganisation des paramètres (3/3)
#!/usr/bin/sh
set alfred oscar romeo zoulou
echo "set alfred oscar romeo zoulou"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
shift
echo "Après un shift"
echo "Nombre de parametres : $#"
echo "Parametres : 1=$1 2=$2 3=$3 4=$4"
echo "Liste : $*"
$ ./[Link]
set alfred oscar romeo zoulou
Nombre de parametres : 4
Parametres : 1=alfred 2=oscar 3=romeo 4=zoulou
Liste : alfred oscar romeo zoulou
Après un shift
Nombre de parametres : 3
Parametres : 1=oscar 2=romeo 3=zoulou 4=
Liste : oscar romeo zoulou
12/12/2024 Y. Evelyne KAM/SOGLI 46
23
12/12/2024
Exercices
Ecrire un programme Shell qui s’appelle
[Link] et qui affiche le premier paramètre
de votre script deux fois sur la même ligne.
$ ./[Link] "Mon message"
Mon message Mon message
Ecrire un programme Shell qui s’appelle
[Link] et qui affiche le message "Entrez un
mot : ", lit le mot saisi par l'utilisateur puis affiche
ce mot deux fois sur la même ligne.
12/12/2024 Y. Evelyne KAM/SOGLI 47
II. Scripts –II-6-Code de retour d’un script Shell et redirections
[Link] de retour d’un script Shell (1/2)
Le code de retour d'un programme Shell est le code de retour de
la dernière commande qu'il a exécutée. Mais vous pouvez avoir
besoin dans votre script de gérer des erreurs (paramètres non
valides, erreurs dans l’exécution du script, ...). Par défaut, si un
script s’exécute correctement (ou une commande Unix), le code
retourné est 0.
Il est parfois nécessaire de positionner explicitement le code de
retour d'un programme Shell (que vous écrivez) avant qu'il ne se
termine : on utilise alors la commande interne exit. Elle provoque
l'arrêt du programme Shell avec un code de retour égal à n (le
paramètre spécifié en argument).
#!/bin/bash
echo "Bonjour"
exit 1
12/12/2024 Y. Evelyne KAM/SOGLI 48
24
12/12/2024
II. Scripts –II-6-Code de retour d’un script Shell et redirections
[Link] de retour d’un script Shell (2/2)
La valeur de retour du script est alors 1. Pour consulter cette
valeur, il faut utiliser une autre variable spéciale : $?. Après
exécution du script précédent, cela donnera :
$ echo $?
1
Attention, si vous utilisez exit n dans votre interpréteur de
commande, cela aura pour effet de l’arrêter en renvoyant la
valeur n spécifiée.
12/12/2024 Y. Evelyne KAM/SOGLI 49
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2. Redirections
12/12/2024 Y. Evelyne KAM/SOGLI 50
25
12/12/2024
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.1. En sortie (1/2)
12/12/2024 Y. Evelyne KAM/SOGLI 51
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.1. En sortie (2/2)
12/12/2024 Y. Evelyne KAM/SOGLI 52
26
12/12/2024
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.2. En entrée
12/12/2024 Y. Evelyne KAM/SOGLI 53
12/12/2024 Y. Evelyne SOGLI / S. Thierry SANOU 54
27
12/12/2024
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.3. Les canaux standards(1/3)
12/12/2024 Y. Evelyne KAM/SOGLI 55
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.3. Les canaux standards (2/3)
12/12/2024 Y. Evelyne KAM/SOGLI 56
28
12/12/2024
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.3. Les canaux standards (3/3)
12/12/2024 Y. Evelyne KAM/SOGLI 57
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.4. Filtre : définition
12/12/2024 Y. Evelyne KAM/SOGLI 58
29
12/12/2024
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.5. Pipelines / tubes (1/2)
12/12/2024 Y. Evelyne KAM/SOGLI 59
II. Scripts –II-6-Code de retour d’un script Shell et redirections
II.6.2.5. Pipelines / tubes (2/2)
12/12/2024 Y. Evelyne KAM/SOGLI 60
30
12/12/2024
II. Scripts -[Link] structures de contrôles
[Link] commande test (1/9)
Il est possible d’effectuer trois types de tests différents en bash :
• des tests sur des chaînes de caractères ;
• des tests sur des nombres ;
• des tests sur des fichiers.
Tests sur des chaînes de caractères
Comme vous devez désormais le savoir, en bash toutes les
variables sont considérées comme des chaînes de caractères. Il
est donc très facile de tester ce que vaut une chaîne de
caractères.
12/12/2024 Y. Evelyne KAM/SOGLI 61
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (2/9)
Vérifions par exemple si deux paramètres sont différents :
12/12/2024 Y. Evelyne KAM/SOGLI 62
31
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (3/9)
Vous trouverez les différents types de tests disponibles sur le
tableau suivant.
12/12/2024 Y. Evelyne KAM/SOGLI 63
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (4/9)
Tests sur des nombres
Bien que bash gère les variables comme des chaînes de
caractères pour son fonctionnement interne, rien ne nous
empêche de faire des comparaisons de nombres si ces variables
en contiennent. Vous trouverez les différents types de tests
disponibles sur le tableau suivant
12/12/2024 Y. Evelyne KAM/SOGLI 64
32
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (5/9)
12/12/2024 Y. Evelyne KAM/SOGLI 65
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (6/9)
Vérifions par exemple si un nombre est supérieur ou égal à un
autre nombre :
12/12/2024 Y. Evelyne KAM/SOGLI 66
33
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (7/9)
Tests sur des fichiers
Un des avantages de bash sur d'autres langages est que l'on peut
très facilement faire des tests sur des fichiers : savoir s'ils existent,
si on peut écrire dedans, s'ils sont plus vieux, plus récents, etc. Le
tableau suivant présente les différents types de tests disponibles.
12/12/2024 Y. Evelyne KAM/SOGLI 67
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (8/9)
Tests sur des fichiers
12/12/2024 Y. Evelyne KAM/SOGLI 68
34
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] commande test (9/9)
Tests sur des fichiers
Je vous propose de faire un script qui demande à l'utilisateur d'entrer le nom d'un
répertoire et qui vérifie si c'en est bien un :
12/12/2024 Y. Evelyne KAM/SOGLI 69
II. Scripts -[Link] Les structures de contrôles
[Link] test if (1/7)
La syntaxe est la suivante:
if condition1
then
liste_commande1
elif condition2
then
liste_commande2
else
liste_commande3
fi
Les conditions condition1 et condition2 doivent être des
commandes. En shell, la valeur zéro est associée à la valeur
booléenne vraie et toute autre valeur correspond à la valeur faux.
Les parties elif et else sont optionnelles.
12/12/2024 Y. Evelyne KAM/SOGLI 70
35
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] test if (2/7)
Remarque :
La condition à tester par l’instruction if peut être une combinaison de plusieurs conditions.
Par exemple :
if cond1 && cond2
then
liste_commande1 il faut que cond1 et cond2 soient vrais pour que
else liste_commande1 soit exécutée
liste_commande2
fi
if cond1 || cond2
then
liste_commande1 il faut que cond1 ou cond2 soient vrais pour que
else liste_commande2 soit exécutée
liste_commande2
fi
12/12/2024 Y. Evelyne KAM/SOGLI 71
II. Scripts -[Link] Les structures de contrôles
[Link] test if (3/7)
Exemple
12/12/2024 Y. Evelyne KAM/SOGLI 72
36
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] test if (4/7)
Effectuer plusieurs tests à la fois
Dans un if, il est possible de faire plusieurs tests à la fois. En général, on vérifie :
• si un test est vrai ET qu'un autre test est vrai ;
• si un test est vrai OU qu'un autre test est vrai.
Les deux symboles à connaître sont :
&& : signifie « et » ;
|| : signifie « ou ».
Il faut encadrer chaque condition par des crochets. Prenons un exemple :
12/12/2024 Y. Evelyne KAM/SOGLI 73
II. Scripts -[Link] Les structures de contrôles
[Link] test if (5/7)
Effectuer plusieurs tests à la fois
Le test vérifie deux choses :
qu'il y a au moins un paramètre (« si$#est supérieur ou égal à 1 ») ;
que le premier paramètre est bienkoala(« si$1est égal àkoala »).
Si ces deux conditions sont remplies, alors le message indiquant que l'on a trouvé le bon
mot de passe s'affichera.
Notez que les tests sont effectués l'un après l'autre et seulement s'ils sont nécessaires. Bash
vérifie d'abord s'il y a au moins un paramètre. Si ce n'est pas le cas, il ne fera pas le second
test puisque la condition ne sera de toute façon pas vérifiée.
12/12/2024 Y. Evelyne KAM/SOGLI 74
37
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] test if (6/7)
Inverser un test
Il est possible d'inverser un test en utilisant la négation. En bash,
celle-ci est exprimée par le point d'exclamation « ! ».
Vous en aurez besoin, donc n'oubliez pas ce petit point
d'exclamation.
12/12/2024 Y. Evelyne KAM/SOGLI 75
II. Scripts -[Link] Les structures de contrôles
[Link] test if (7/7)
Exo: Ecrire un script [Link] qui affiche le contenu du
répertoire donné en paramètre. S’il n’y a pas exactement un
paramètre, un message est affiché
12/12/2024 Y. Evelyne KAM/SOGLI 76
38
12/12/2024
1)Ecrire un script [Link] qui affiche le contenu du répertoire donné en
paramètre. S’il n’y a pas exactement un paramètre, un message est affiché
2)Ecrire un programme Shell quel_age.sh qui vous demande votre date de
naissance, puis calcule et affiche votre âge. Pour que votre programme
fonctionne aussi l’année prochaine, vous veillerez à faire le calcul avec l’année
en cours (date +"%Y").
3)Créer un script shell nommé "nombreJours" qui affichera le nombre de
jours du mois courant.
"nombreJours" affichera pour décembre 2014 le message "31 jours en
decembre 2014".
4)Ecrivez le script [Link] qui affiche un message de bienvenue :
$ ./[Link]
Bonjour zorro, bienvenu sur hal9000, nous sommes le 08/12/2014 et il est
10:17 Ici, zorro est le nom de l’utilisateur qui exécute ce programme, hal9000
est le nom de la machine sur laquelle on l’exécute. Ces informations sont
contenues dans les variables USER et HOSTNAME.
12/12/2024 77
II. Scripts -[Link] Les structures de contrôles
[Link] test case (1/3)
Cette structure de contrôle permet d’effectuer un branchement conditionnel sur une
séquence de commandes en fonction de la valeur d’une variable. La syntaxe est la
suivante :
case valeur in
modèle1) liste_commande1 ;;
modèle2) liste_commande2 ;;
Esac
Exemple 1 :
On a vu tout à l'heure un if un peu complexe qui faisait appel à des elif et à un
else :
Ce genre de « gros if qui teste toujours la même variable » ne pose pas de
problème mais n'est pas forcément très facile à lire pour le programmeur. À la
place, il est possible d’utiliser l'instruction case si nous voulons.
Le rôle de case est de tester la valeur d'une même variable, mais de manière
plus concise et lisible.
12/12/2024 Y. Evelyne KAM/SOGLI 78
39
12/12/2024
II. Scripts -[Link] Les structures de contrôles
[Link] test case (2/3)
Voyons comment on écrirait la condition précédente avec un
case :
12/12/2024 Y. Evelyne KAM/SOGLI 79
II. Scripts -[Link] Les structures de contrôles
[Link] test case (3/3)
Exemple 2 :
Nous pouvons aussi faire des « ou » dans un case. Dans ce cas, petit piège, il ne faut pas
mettre deux||mais un seul ! Exemple :
12/12/2024 Y. Evelyne KAM/SOGLI 80
40
12/12/2024
II. Scripts -[Link] Les structures de boucle
[Link] boucle for (1/4)
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.
La syntaxe est la suivante :
for var in liste
do
liste_commandes
done
La liste de commandes sera exécutée autant de fois que ce
contient la liste en nombre d’éléments.
12/12/2024 Y. Evelyne KAM/SOGLI 81
II. Scripts -[Link] Les structures de boucle
[Link] boucle for (2/4)
Exemples :
#!/bin/bash
for variable in 'valeur1' 'valeur2' 'valeur3‘
do
echo "La variable vaut $variable«
done
Ce qui donne, si on l'exécute :
La variable vaut valeur1
La variable vaut valeur2
La variable vaut valeur3
12/12/2024 Y. Evelyne KAM/SOGLI 82
41
12/12/2024
II. Scripts -[Link] Les structures de boucle
[Link] boucle for (3/4)
Vous pouvez donc vous servir du for pour faire une boucle sur
une liste de valeurs que vous définissez :
#!/bin/bash
for animal in 'chien' 'souris' 'moineau' do
echo "Animal en cours d'analyse : $animal »
done
Animal en cours d'analyse : chien
Animal en cours d'analyse : souris
Animal en cours d'analyse : moineau
12/12/2024 Y. Evelyne KAM/SOGLI 83
II. Scripts -[Link] Les structures de boucle
[Link] boucle for (4/4)
Toutefois, la liste de valeurs n'a pas besoin d'être définie
directement dans le code. On peut utiliser une variable :
#!/bin/bash
liste_fichiers=`ls`
for fichier in $liste_fichiers
do
echo "Fichier trouvé : $fichier "
done
Ce script liste tous les fichiers trouvés dans le répertoire actuel :
Fichier trouvé : [Link]
Fichier trouvé : [Link]
Fichier trouvé : [Link]
12/12/2024 Y. Evelyne KAM/SOGLI 84
42
12/12/2024
II. Scripts -[Link] Les structures de boucle
[Link] boucle WHILE (1/4)
La syntaxe est la suivante :
while condition
do
liste_commandes
Done
Cette structure permet de boucler sur une séquence de
commandes tant que la condition est vraie. La boucle
est interrompue si la valeur de retour est différente de
zéro.
12/12/2024 Y. Evelyne KAM/SOGLI 85
II. Scripts -[Link] Les structures de boucle
[Link] boucle WHILE (2/4)
Exemple: On va demander à l'utilisateur de dire « oui » et répéter cette action
tant qu’il n'a pas fait ce que l'on voulait. Nous allons créer un script [Link]
pour l'occasion :
On fait deux tests.
Est-ce que $reponse est vide ?
Est-ce que $reponse est différent de oui ?
12/12/2024 Y. Evelyne KAM/SOGLI 86
43
12/12/2024
II. Scripts -[Link] Les structures de boucle
[Link] boucle WHILE (3/4)
Comme il s'agit d'un OU (||), tant que l'un des deux tests est vrai,
on recommence la boucle. Cette dernière pourrait se traduire
par : « Tant que la réponse est vide ou que la réponse est
différente de oui ».
Nous sommes obligés de vérifier d'abord si la variable n'est pas
vide, car si elle l'est, le second test plante (essayez, vous verrez).
12/12/2024 Y. Evelyne KAM/SOGLI 87
II. Scripts -[Link] Les structures de boucle
[Link] boucle WHILE (4/4)
Essayons ce script :
Dites oui : euh
Dites oui : non
Dites oui : bon
Dites oui : oui
Comme vous pouvez le voir, il ne s'arrête que lorsque l'on a tapé
oui !
Il existe aussi le mot clé until, qui est l'exact inverse de while. Il
signifie « Jusqu'à ce que ».
Remplacez juste while par until dans le code précédent pour
l'essayer.
12/12/2024 Y. Evelyne KAM/SOGLI 88
44
12/12/2024
II. Scripts -[Link] Les structures de boucle
[Link] boucle UNTIL
La boucle est exécutée jusqu’à ce que la dernière commande de la
suite_commande renvoie la valeur 0, à ce moment la boucle est
interrompue.
La syntaxe est la suivante :
until suite_commande
Do
liste_commandes
done
Remarque :
La commande break permet d’interrompre l’exécution d’une boucle. La
commande continue permet de relancer l’exécution d’une boucle.
12/12/2024 Y. Evelyne KAM/SOGLI 89
II. Scripts -[Link] Les structures de boucle
Exo
$ cat [Link]
#!/usr/bin/sh
echo "Continuer (O/N) ? \c"
read reponse
echo "reponse=$reponse"
case $reponse in
O)
echo "Oui, on continue"
;;
N)
echo "Non, on s'arrête"
exit 0
;;
*)
echo "Erreur de saisie (O/N)"
exit 1
;;
esac
12/12/2024 Y. Evelyne KAM/SOGLI 90
45
12/12/2024
II. Scripts -[Link] Les structures de boucle
Exo
echo "Vous avez continue. Tapez deux mots ou plus :\c"
read mot1 mot2
echo "mot1=$mot1\nmot2=$mot2"
exit 0
$ ./[Link]
Continuer (O/N) ? O
reponse=O
Oui, on continue
Vous avez continue. Tapez deux mots ou plus :salut les amis
mot1=salut
mot2=les amis
12/12/2024 Y. Evelyne KAM/SOGLI 91
II. Scripts -[Link] tableaux (1/4)
Le bash gère également les variables « tableaux ». Ce sont des variables qui
contiennent plusieurs cases, comme un tableau. Vous en aurez probablement
besoin un jour ; voyons comment cela fonctionne.
Pour définir un tableau, on peut faire comme ceci :
tableau=('valeur0' 'valeur1' 'valeur2')
Cela crée une variable tableau qui contient trois valeurs (valeur0, valeur1,
valeur2).
Pour accéder à une case du tableau, il faut utiliser la syntaxe suivante :
${tableau[2]}
ceci affichera le contenu de la case n° 2 (donc valeur2).
12/12/2024 Y. Evelyne KAM/SOGLI 92
46
12/12/2024
II. Scripts -[Link] tableaux (2/4)
Remarque: Les cases sont numérotées à partir de 0 ! La première
case a donc le numéro 0. Notez par ailleurs que pour afficher le
contenu d'une case du tableau, vous devez entourer votre variable
d'accolades comme je l'ai fait pour ${tableau[2]}.
Vous pouvez aussi définir manuellement le contenu d'une case :
tableau[2]='valeur2'
12/12/2024 Y. Evelyne KAM/SOGLI 93
II. Scripts -[Link] tableaux (3/4)
Essayons tout ceci dans un script :
#!/bin/bash
tableau=('valeur0' 'valeur1' 'valeur2')
tableau[5]='valeur5‘
echo ${tableau[1]}
À votre avis, que va afficher ce script ?
Remarque: Comme vous pouvez le constater, le tableau peut avoir
autant de cases que vous le désirez. La numérotation n'a pas
besoin d'être continue, vous pouvez sauter des cases sans aucun
problème (la preuve, il n'y a pas de case n° 3 ni de case n° 4 dans
mon script précédent).
12/12/2024 Y. Evelyne KAM/SOGLI 94
47
12/12/2024
II. Scripts -[Link] tableaux (4/4)
Vous pouvez afficher l'ensemble du contenu du tableau d'un seul
coup en utilisant ${tableau[*]} :
#!/bin/bash
tableau=('valeur0' 'valeur1' 'valeur2')
tableau[5]='valeur5'
echo ${tableau[*]}
valeur0 valeur1 valeur2 valeur5
12/12/2024 Y. Evelyne KAM/SOGLI 95
II. Scripts -[Link] fonctions
Definition
Une fonction, c’est un ensemble d’instructions, permettant d'effectuer plusieurs
tâches avec des paramètres d'entrée différents.
Son utilisation vous permettra de rendre votre programme plus lisible et
structuré. Ainsi, il facilitera le développement de votre programme.
Remarques
• vous pouvez appeler votre fonction autant de fois que vous le souhaitez dans
votre script.
• Vous n'êtes pas limité dans le nombre de fonction. Par contre, elles ne
doivent pas avoir le même nom.
• Vous pouvez réutiliser les variables globales initialiser dans votre script à
l'intérieur ou à l'extérieur de votre fonction.
• Vous pouvez déclarer des variables locales à vos fonctions.
• Une bonne fonction, c'est une fonction qui traite d'un élément spécifique et
récurrent dans votre script.
12/12/2024 Y. Evelyne KAM/SOGLI 96
48
12/12/2024
II. Scripts -[Link] fonctions
Declaration
En Bash, il y a deux manières pour déclarer une fonction
# déclaration méthode 1
maFonction ()
{
bloc d’instructions
}
#appel de ma fonction
ou
maFonction
# déclaration méthode 2
function maFonction
{
bloc d’instructions
}
#appel de la fonction
maFonction
12/12/2024 Y. Evelyne KAM/SOGLI 97
II. Scripts -[Link] fonctions
Exemple
12/12/2024 Y. Evelyne KAM/SOGLI 98
49
12/12/2024
II. Scripts -[Link] fonctions
• Une fonction comprend plusieurs instructions.
• Vous pouvez l'appeler autant de fois que vous voulez dans votre
code : laissez donc votre fonction assez générique et faites-la
varier grâce aux paramètres que vous pouvez préciser en
l'appelant.
• Vous pouvez déclarer une fonction Bash avec maFonction
()ou function maFonction.
• Vous faites ensuite appel à votre fonction maFonction() en
tapant simplement dans votre code maFonction.
12/12/2024 Y. Evelyne KAM/SOGLI 99
II. Scripts -[Link] fonctions
Les appels entre fonctions
Sachez enfin que des fonctions peuvent appeler d'autres fonctions, ce qui
donne une extrême souplesse à leur utilisation.
En voici un bref exemple :
12/12/2024 Y. Evelyne KAM/SOGLI 100
50
12/12/2024
II. Scripts -[Link] fonctions
12/12/2024 Y. Evelyne KAM/SOGLI 101
51