Shell Script L3IRT 2024
Shell Script L3IRT 2024
Shell Script L3IRT 2024
Avril 2024
DÉFINITIONS 2
Ces commandes sont exécutées les unes après les autres par un interpréteur (le shell
dans notre cas)
Tout ce qui est réalisable en ligne de commande peut être inclus dans un script
Pour exécuter un script, on utilisera suivant le cas, un chemin relatif ou un chemin absolu
./nom_fichier
Exemple ./monscript.sh
Editeur
On peut utiliser n’importe quel éditeur disponible dans l’environnement
Exemple : gedit, emacs, vi, vim, nano sous Linux ; notepad++ sous windows
Le Shebang
C’est la première ligne qu’on trouve dans un fichier de script shell
#!/bin/bash
Il commence par un « # » (ce qui correspond la plupart du temps à des commentaires) puis
d’un « ! » et enfin le chemin menant au programme Bash Shell
ECRIRE UN SCRIPT 8
Le Shebang
On y indique le chemin de l’interpréteur qui va lire le script.
Il en existe d’autres. Ci-dessous, quelques exemples :
#!/bin/sh
#!/bin/csh
#!/bin/zsh
#!/usr/bin/python
…
LES COMMENTAIRES 9
Les commentaires permettent de rendre des parties du contenu du fichier de script non
interprétées par l’interpréteur
Ainsi, en dehors du shebang, toute ligne commençant par # ne sera pas interprétée
#!/bin/bash
echo "Bonjour tout le monde"
#Ceci est un commentaire
echo "Merci pour l’explication" #Ceci ne sera pas interprété
LES VARIABLES 10
Il existe deux catégories de variables : Les variables définies par l’utilisateur et les variables
prédéfinies (variables prépositionnées, variables d’environnement, etc.)
LES VARIABLES 11
Le nom d‘une variable est sensible à la casse : une distinction est faite entre majuscule et
minuscule
Syntaxe de déclaration
NOM_DE_LA_VARIABLE="valeur"
Nota : Il ne faut pas mettre d'espace entre le nom de la variable, le signe = et "
Syntaxe d’utilisation
Pour utiliser le contenu d’une variable, il faut faire précéder le nom de la variable par un $
#!/bin/bash
PRENOM="Luc"
NOM="SAGBO"
echo "Bonjour $PRENOM $NOM et bienvenue au cours de script shell"
#En supposant que le fichier du code ci-dessus se nome script.sh, et qu’on a déjà défini les
droits d’accès appropriés dessus, son exécution se fera comme suit :
./script.sh
#ce qui donnera comme résultat :
Bonjour Luc SAGBO et bienvenue au cours de script shell
LES VARIABLES 14
Nota : Dans certains cas, on est obligé d’utiliser les accolades pour entourer le nom de la variable
#!/bin/bash
PRENOM="Luc"
NOM="SAGBO"
AGE="16"
echo "Bonjour $PRENOM ${NOM}, vous avez ${AGE}ans"
./script.sh
Bonjour Luc SAGBO, vous avez 16ans
Nota : Ici, si on ne mettait pas les accolades, on aurait de problèmes dans l’interprétation de $NOM, à cause de la
virgule qui est collée au nom de la variable. De même on n’aurait pas pu afficher l'âge avec la chaine ans collée à la
variable désignant l'âge.
LES VARIABLES 15
#!/bin/bash
PRENOM="Luc"
NOM="SAGBO"
MACHINE=$(hostname)
echo "Bonjour $PRENOM $NOM et bienvenu sur la machine ${MACHINE}."
LES VARIABLES 16
#!/bin/bash
PRENOM="Luc"
NOM="SAGBO"
MACHINE=`hostname`
echo "Bonjour $PRENOM $NOM et bienvenu sur la machine ${MACHINE}."
LES VARIABLES SPÉCIFIQUES : PRÉPOSITIONNÉES 17
Quelques variables spécifiques au shell qui permettent de récupérer des informations sur les arguments
passés ou sur l'exécution en cours.
$0 indique le nom d'une commande (nom du shell ou du script shell en cours d’exécutionou)
$# indique le nombre de paramètres positionnels d'une commande (nombre total d'arguments passés)
$$ indique le numéro de processus du shell courant (PID : Process ID)
$? Code qui indique un résultat lié au déroulement de la dernière commande exécutée
0 : Pas d'erreur. Autre valeur : cas contraire.
$* ensemble des paramètres (arguments) d'une commande (sous forme de liste séparée par le l'IFS)
$@ ensemble des paramètres (arguments) d'une commande (sous forme de liste séparée par des espaces)
$1 à $9 représentent des paramètres positionnels (les arguments passés à une commande ou à un script).
LES VARIABLES D'ENVIRONNEMENT 18
Nota : La liste des variables spéciales et celles d’environnement présentées ici n’est que
partielle. Pour connaitre par exemple toutes les variables d’environnement, il suffit de taper la
commande env dans la console.
Vous êtes aussi priés de tester chacune des variables présentées sur les pages 15 à 17 pour mieux
en comprendre l’utilité.
Pour tester une des variable, il suffit de faire echo $NOM_VARIABLE
LES CONSTANTES : VARIABLES NON MODIFIABLES 20
Lorsque vous tapez une commande, vous pouvez prendre le temps d'analyser la réponse du
système et prendre une décision en fonction de cette réponse.
Il est tout à fait possible d'effectuer les mêmes étapes avec le scripting Shell grâce aux tests. Il
existe deux formes de tests.
[ voici-la-condition-du-test-a-vérifier ]
Il est important de respecter les espaces après le symbole [ mais également avant le ].
LES TESTS 22
Exemple 2 : Vérifier si la chaine contenue dans la variable NOM est vide ou non
[ -z NOM ]
• La commande retourne la valeur 0 (True) si la chaine est vide
• La commande retourne la valeur 1 (False) si la chaine n’est pas vide
Nota : Pour connaitre la valeur retournée par l’exécution d’une commande, il faut lire le contenu de la
variable spéciale $? Après avoir exécuté la commande
LES TESTS 23
Comparer deux chaînes : Soit le script shell monscript.sh dont le code est ci dessous
#!/bin/bash
PRENOM='Luc'
NOM='SAGBO'
[ $PRENOM = $NOM ]
echo $?
./monscript.sh
1
Nota : Avec =, le script nous renvoie 0 si les deux chaînes sont identiques et 1 si elles ne le sont pas
LES TESTS 25
./monscript.sh
0
Nota : Avec !=, le script nous renvoie 0 si les deux chaînes ne sont pas identiques et 1 si elles le sont
LES OPÉRATEURS 26
Les opérateurs permettent de faire des opérations sur les données et les valeurs.
❑ Opérateurs arithmétiques
Opérateur Description Exemple
+ Addition de valeurs echo $((2+2))
* Multiplication de valeurs echo $((2*2))
- Soustraction d’une valeur à une autre echo $((4-2))
/ Divise des valeurs echo $((4/2))
% Renvoie le reste d'une division echo $((10%3))
Nota : on peut aussi utiliser l’opérateur expr pour évaluer une expression.
Exemple : echo `expr 2 + 2`
LES OPÉRATEURS 27
❑ Opérateurs logiques
Opérateur Description Exemple
&& Correspond au ET logique [ 5 -eq 5 ] && [ 6 -eq 7 ]
|| Correspond au OU logique [ 5 -eq 5 ] || [ 7 -lt 5 ]
❑ Opérateurs de comparaison
Opérateur Description Opérateur Description
-eq égale (comparaison numérique) -gt Supérieur strict (comparaison numérique)
== ou = égale (chaine de caractères) -ge Supérieur ou = (comparaison numérique)
-ne différent (comparaison numérique) -lt Inférieur strict (comparaison numérique)
.
!= différent (chaine de caractère) -le Inférieur ou = (comparaison numérique)
LES OPÉRATEURS 28
La commande read permet d'accepter les données venant de l’entrée standard (STDIN).
L’utilisateur peut dont entrer des données à partir du clavier.
Syntaxe d’utilisation
La syntaxe de base est la suivante : read NOM_VARIABLE
Lorsqu’on souhaite afficher un message indicatif avant la lecture, on peut utiliser l’option –p
read –p "Le message indicatif : " NOM_VARIABLE
Exemple :
read –p "Entrez votre nom : " NOM
Ce qui est équivalent à : echo "Entrez votre nom : "
read NOM
ENTRÉE UTILISATEUR 31
On peut lire dans plusieurs variables à la fois avec une seule instruction read
Exemple : read NOM PRENOM
Exemple :
cark@osboxes:~$ OLDIFS="$IFS"
cark@osboxes:~$ IFS="|"
cark@osboxes:~$ read A B C
azerty|qwerty|papou
cark@osboxes:~$ echo $B
qwerty
cark@osboxes:~$ IFS="$OLDIFS"
cark@osboxes:~$ read A B C
azerty|qwerty|papou
cark@osboxes:~$ echo $A
azerty|qwerty|papou
ENTRÉE UTILISATEUR 33
On a également la possibilité d’utiliser le commande read pour lire une donnée sans
l’afficher lors de la saisie.
Ceci peut-être très utile pour la saisie de mot de passe.
Pour cela on ajoute l’option –s à l’option –p.
Nota : avec l'option -s, il est recommandé d'ajouter la commande echo pour afficher
un saut de ligne.
if [ condition-est-vraie ] if [ condition1-est-vraie ]
if [ condition-est-vraie ] then
then
then command1
command1
command1 elif [ condition2-est-vraie ]
else
command2 then
command2
fi command2
fi
else
command3
fi
LES STRUCTURE DE CONTRÔLE 36
Exercice :
Créer un script qui demande à l'utilisateur de saisir une note comprise entre 0 et 20 et qui
affiche un message en fonction de cette note :
"très bien" si la note est entre 16 et 20, 16 inclus ;
"bien" lorsqu'elle est entre 14 et 16, 16 exclue ;
"assez bien" si la note est entre 12 et 14, 14 exclue ;
"passable" si la note est entre 10 et 12 ; 12 exclue
"insuffisant" si la note est inférieur à 10.
LES STRUCTURE DE CONTRÔLE 37
#!/bin/bash
Correction Exercice :
echo "Entrez votre note :"
read note
if [ "$note" -ge 16 ]; then
echo "très bien"
elif [ "$note" -ge 14 ]; then
echo "bien"
elif [ "$note" -ge 12 ]; then
echo "assez bien"
elif [ "$note" -ge 10 ]; then
echo "moyen"
else
echo "insuffisant"
fi
LES STRUCTURE DE CONTRÔLE 38
Syntaxe d’utilisation
for VARIABLE in OBJET1 OBJET2 OBJET3 OBJETn
do
command1
command2
done
LES STRUCTURE DE CONTRÔLE 40
Exemple :
#!/bin/bash #!/bin/bash
Syntaxe d’utilisation
while [ la-condition-est-vraie ]
do
command1
command2
done
LES STRUCTURE DE CONTRÔLE 42
Les Boucles :
Hh j,,
w
la boucle while
Exemple :
#!/bin/bash
while [ -z $PRENOM ]
do
read –p "Quel est votre prenom ?" PRENOM
done
echo "Votre prenom est $PRENOM"
Exercice
Création d'un jeu qui permet à l'utilisateur de deviner un chiffre généré par le script entre 1 et 50. A
chaque fois que l'utilisateur entre un chiffre, le script lui indique si le chiffre à trouver est supérieur ou
inférieur à celui qu'il a entré, etc.
LES STRUCTURE DE CONTRÔLE 43
Les Boucles :
Hh j,,
la boucle until
La boucle until fait la même chose que la boucle while, à la différence qu’ici la boucle
est exécutée tant que la condition est fausse (contrairement à la boucle while)
#!/bin/bash
until [ -n "$PRENOM" ]
do
read –p "Quel est votre prenom ?" PRENOM
done
echo "Votre prenom est $PRENOM"
LES FONCTIONS 44
Une fonction est un block de code désigné sous un nom et spécialisé dans un
traitement. Les fonctions présentent plusieurs avantages, à savoir :
❑ écrire un block de code une fois, et le réutiliser autant de fois que nécessaire
❑ avoir du code modulaire et aéré
❑ faire facilement la maintenance du code
Il existe deux syntaxe de définition d’une fonction. Les deux sont présentées sur
la page qui suit :
LES FONCTIONS 45
#!/bin/bash
function check_server() {
ping -c 1 192.168.8.1 #on suppose que l’IP du serveur est 192.168.8.1
if [ $? -eq 0 ] then ;
echo "Le serveur est joignable"
else
echo "Le serveur n’est pas joignable"
fi
}
LES FONCTIONS 47
Pour déclarer une variable locale on doit précéder le nom de la variable du mot clé local
LES FONCTIONS 51
Pour lancer une fonction qui est définie dans un Une fois que le fichier est chargé, on peut appeler
fichier de script shell à partir d'une ligne de la fonction en tapant son nom suivi de ses
commande (prompt), on doit d'abord charger le arguments éventuels.
fichier de script en utilisant la commande source
ou . (point). Voici la syntaxe générale : $ source mon_script.sh
$ ma_fonction argument1 argument2
$ source nom_du_fichier.sh
ou Nota : faire attention au chemin d’accès au script
$ . nom_du_fichier.sh
LES WILDCARDS : CARACTÈRES GÉNÉRIQUES 53
Un wildcard est un caractère (ou une chaîne de caractères) générique ou de substitution qui
est utilisé dans une expression pour prendre un certain nombre de valeurs
On les utilise avec la plupart des commandes, mais très souvent avec les commandes ls, mkdir
et rm
Caractères spéciaux : ? et *
? Désigne exactement un seul caractère
Exemple
$ echo fichier?.txt #fichiers fichier1.txt, fichier2.txt, fichiers.txt, si ces fichiers existent dans le dossier courant
$echo t?t?.txt #fichiers toto.txt, tato.txt, titi.txt, si des fichiers comme ça existent dans le dossier courant
LES WILDCARDS : CARACTÈRES GÉNÉRIQUES 54
Exemple
$ echo *t* #peut donner table, fictif.txt, toto.txt, toise, si ces fichiers ou dossiers existent
$ echo t*.txt #tous les fichiers txt commençant par t, s’ils existent
Nota : On ne peut pas utiliser ? ou * au début pour retrouver les fichiers préfixés par le caractère point (.)
Il faut le spécifier explicitement avant de mettre ? ou *
Exemple
$ echo .*
LES WILDCARDS : CARACTÈRES GÉNÉRIQUES 55
Les filtres sont des commandes qui peuvent être appliqués sur les fichiers
textes ou sur les résultats d’une commande produisant du texte. Les filtres,
comme leur nom l’indique, permettent de filtrer (restreindre, épurer,
clarifier) un flux de données.
Les commandes qui lisent et écrivent sur les E/S sont appelées des filtres. Les
filtres sont souvent utilisés en branchement de commandes (en réalisant un
tube avec l’aide du caractère | ou caractère pipe).
LES FILTRES 57
syntaxe :
head [options] <fichier> tail [options] <fichier>
Exemples :
$ head -n 15 /var/log/syslog
$ cat /var/log/syslog | tail -n 15
LES FILTRES 58
syntaxe :
head [options] <fichier> tail [options] <fichier>
Exemples :
$ head -n 15 /var/log/syslog
$ cat /var/log/syslog | tail -n 15
LES FILTRES 57
• La commande split
• La commande split permet de découper un fichier en plusieurs fichiers plus
petits (si possible de même taille).
• Les fichiers créés par la commande split seront nommés PREFIXEaa,
PREFIXEab, ..., la chaîne PREFIXE étant donnée en argument de la commande.
Exemples :
$ split -b 22M /var/log/syslog log_ #l’option –b permet de spécifier la taille des fichiers log_
split -l 30 /var/log/syslog log_ #l’option –l permet de spécifier le nombre de lignes
split -n 5 /var/log/syslog log_ #l’option –n permet de spécifier le nombre de fichiers
LES FILTRES 58
La commande cut
C’est une commande qui permet d’extraire des colonnes d’un fichier.
Nota : Le séparateur par défaut est la tabulation (ce qui est différent de l’espace). Lorsqu’on
veut définir son propre séparateur, on utilise l’option -d
Pour plus de détail, consulter l’aide avec la commande man cut
LES FILTRES 59
La commande cut
C’est une commande qui permet d’extraire des colonnes d’un fichier.
Exemples :
$ cut -c1-2 tri.txt #extrait les deux premiers caractères du fichier tri.txt
$ cut -f2,5 tri.txt #extrait les seconde et cinquième colonnes
$ cut –f1 –d " " .bash_history #première colonne
$ cat extr.txt | cut -d " " -f 2
LES FILTRES 60
• La commande tar
• La commande tar permet de transformer une hiérarchie de fichiers et/ou de dossiers en
une archive prenant la forme d’un seul fichier au format tar. Elle permet aussi d’extraire les
archives.
• Il faut noter que la commande tar ne permet pas de compresser les données
La commande tar
Syntaxe de création d’une archive
tar cvf nom_fichier_a_creer.tar chemin_repertoire_existant
La commande tar
Option Signification
t visualiser le contenu
x extraire une archive
c créer une archive
f le nom de l’archive
C permet de choisir le répertoire de destination de l’archive ou d’extraction
v mode verbeux
LES ARCHIVES : ARCHIVAGE ET COMPRESSION 64
La commande gzip
La commande gzip permet de compresser des fichiers.
Compression utilisée avant transfert du fichier via réseau pour réduire temps de transfert.
Nota : La commande gzip est aussi une option de la commande tar. En effet, dans la commande
tar czvf f.tgz dossier/, l’option z permet de compresser directement l’archive créée. Dans notre cas, l’archive du
répertoire dossier/ sera compressée et sera sous le fichier f.tgz.
L’extraction se demande avec l’option x à la place de l’option c du tar.
LES ARCHIVES : ARCHIVAGE ET COMPRESSION 65
• La commande gzip
• Si l’on veut conserver le fichier original et produire en même temps un fichier compressé, on
utilise l’option -c de la commande gzip.
• Nota : Cette option ne crée plus automatiquement le fichier résultat, mais redirige les
données compressées vers la sortie standard. Aussi, il faut rediriger cette sortie vers le fichier
à produire :
gzip -c monFichier > monFichier.gz
• Il existe d’autres commandes pour gérer les archives (commandes à tester par vous-même) :
❑ gunzip
❑ zcat
• ❑uuencode et uudecode
LES MENUS : BOUCLE «SELECT» 66
La commande select est une structure de contrôle de type itérative qui est
utilisée pour réaliser un menu.
Syntaxe :
select nom_var in item1 item2 item3 ... itemn
do
commandes
done
LES MENUS : BOUCLE «SELECT» 67
• Nota : La liste des items sera affichée à l'écran à chaque tour de boucle et chaque item
est indicé automatiquement.
Exemple : 3)
PS3="Votre choix : " echo "Au revoir"
select texte in "- Traitement 1" "- Traitement 2" "- exit 0
Quitter" ;;
*)
do echo "Choix incorrect : 1 - 2 - 3"
echo "Votre choix est $REPLY : $texte" ;;
case $REPLY in esac
1)
echo "Lancement traitement 1" done
;;
2)
echo "Lancement traitement 2"
;;
CRON : GESTION DES TÂCHES PLANIFIÉES 69
• cron est un programme disponible sur les systèmes de type Unix et permettant de planifier
des taches régulières. C’est un demon qui tourne en tâche de fond du système.
• Le chemain d’accès à ce demon est /etc/init.d/cron.
• Les tâches cron sont créés, soit par des logiciels, soit par l’utilisateur, et se trouvent généralement dans
les répertoires ci-dessous sous forme de scripts à exécuter :
• /etc/cron.d
• /etc/cron.hourly
• /etc/cron.daily
• /etc/cron.weekly
• /etc/cron.monthly
• /var/spool/cron #cas des tâches définies par l’utilisateur
CRON : GESTION DES TÂCHES PLANIFIÉES 70
• Le crontab
• Les tâches planifiées par l’utilisateur dans les fichiers du dossier /var/spool/cron, ne sont
pas directement manipulable (modifiables) mais le sont à travers la commande crontab.
• crontab est donc une commande permettant de gérer les tâches planifiées de chaque
utilisateur.
• Chaque utilisateur du système peut donc avoir sa propre liste de tâches lanifiées.
• Pour connaitre la liste des tâches planifiées on utilise la commande suivante :
$ crontab -l
CRON : GESTION DES TÂCHES PLANIFIÉES 71
Pour définir une nouvelle tâche planifiée par l’utilisateur, on utilise la commande suivante :
$ crontab –e
La syntaxe de la liste des tâches d’un utilisateur est identique et est sous la forme :
m h dom mon dow command
Ci-dessous, un tableau qui présente une liste de valeurs possibles pour chacune de ces valeurs
min heure Jour du mois Jourde la Périodicité
mois semaine
* * * * * Toutes les minutes
30 0 1 1,6,12 * à 00:30 le premier janvier, juin et décembre
CRON : GESTION DES TÂCHES PLANIFIÉES 72
Lorsqu’on a les droit appropriés, il est possible de modifier les tâches Cron d’un autre utilisateur
en spécifiant dans la commande le nom de l’utilisateur avec l’option -u.
crontab -u nom_autre_user -e