0% ont trouvé ce document utile (0 vote)
11 vues51 pages

Introduction à la Programmation Shell

Transféré par

billionsautotrade
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
11 vues51 pages

Introduction à la Programmation Shell

Transféré par

billionsautotrade
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi