PROGRAMMATION SYSTÈME LINUX
2024-2025/ESMT/MASTER ISI&SSI
M. Abagana Mahamat KACHALLAH
Certifié Linux Professional Institute LPIC-2 LINUX ENGINEER
Oracle Cloud Infrastructure Architect Associate ORACLE
PROGRAMME
Programmation SHELL
▪ Les scripts shell
▪ Les variables
▪ L'interactivité
▪ L'arithmétique : les instructions expr, let, bc
▪ Structures de contrôle, boucles
▪ Menu
▪ Scripts d'administration système
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 2
PROGRAMMATION SHELL
SCRIPT SHELL
Le SHELL - Le rôle du SHELL
Un système d'exploitation fournit au moins un shell ou d'une interface; ce qui vous permet de dire à
l'ordinateur ce qu'il doit faire.
Un shell permet d’exécuter des instructions que vous saisissez au clavier ou au sein d’un script et vous en
retourne les résultats. Il prend les commandes saisis par l’utilisateur et les interprète en une forme que
le noyau peut exécuter sur le matériel de l'ordinateur.
Les deux types shell les plus distingués sont le Graphical User Interface (GUI) et Command Line Interface
(CLI).
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 3
PROGRAMMATION SHELL
SCRIPT SHELL
Un script SHELL permet d'automatiser une série d’instructions.
Il se présente sous la forme d'un fichier contenant une ou plusieurs commandes qui seront exécutées de
manière séquentielle.
La première ligne du script (shebang) precise l’interpréteur de commande.
Exemple: #!/bin/bash
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 4
PROGRAMMATION SHELL
SCRIPT SHELL
Pour pouvoir exécuter un script, deux conditions doivent être remplies :
− la première ligne doit contenir: #!/bin/bash ;
− le fichier doit être exécutable: chmod +x mon_script
./mon_script
Si toutes ces conditions ne sont pas remplies, il est toujours possible de forcer l’exécution du script avec la
commande bash:
bash mon_script
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 5
PROGRAMMATION SHELL
SCRIPT SHELL
Les variables
classe=Master var1=$(date +%d%m%Y) var2=`date +%d%m%Y`
echo $classe echo $var1 echo $var2
echo $classe1
echo ${classe}1
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 6
PROGRAMMATION SHELL
SCRIPT SHELL
Les variables: variable d’environnement
Une variable définie n’est accessible que dans le SHELL courant. Elle n’est pas transmise aux processus fils.
Pour qu’elle soit transmise aux processus fils, il faut utiliser le mot clef :
export variable
L’affichage des variables d’environnement se fait avec la commande env
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 7
PROGRAMMATION SHELL
SCRIPT SHELL
Les variables: variable d’environnement
Soit le script afficher_classe
#!/bin/bash
echo "le contenu de la variable classe est: $classe"
classe=Master
./afficher_classe
export classe
./afficher_classe
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 8
PROGRAMMATION SHELL
SCRIPT SHELL
L'interactivité
▪ Passage d'arguments ($0, $n, $#, $*, ...)
▪ La commande read
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 9
PROGRAMMATION SHELL
SCRIPT SHELL
▪ Passage d'arguments ($0, $n, $#, $*, ...)
Les paramètres:
$1,$2,...,$9 premier paramètre, deuxième,...
Les paramètres spéciaux:
$0 Contient le nom du script
$* L'ensembles des paramètres
$# Le nombre de paramètres passés au script
$? Le code retour de la dernière commande
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 10
PROGRAMMATION SHELL
SCRIPT SHELL
▪ Passage d'arguments ($0, $n, $#, $*, ...)
#!/bin/bash
# [Link]
echo "Le nom de mon script est : $0"
echo "Vous avez passé $# paramètres"
echo "Voici la liste des paramètres $*"
echo " le premier paramètre $1"
echo " le deuxième paramètre $2"
./[Link] un deux trois
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 11
PROGRAMMATION SHELL
SCRIPT SHELL
L'interactivité : Passage d'arguments ($0, $n, $#, $*, ...)
Soit le script [Link]
# !/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12
./[Link] un deux trois quatre cinq six sept huit neuf dix onze douze
Quelle est la solution ?
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 12
PROGRAMMATION SHELL
SCRIPT SHELL
L'interactivité avec la commande read
L’instruction read permet de créer des scripts interactifs.
La commande read lit son entrée standard et affecte la valeur saisie dans la variable passée en argument;
on peut avoir plusieurs variable
Exemple: read nom
-p pour afficher un message et -s pour cacher la valeur saisie
Exemple: read -p "Entrez votre nom: " nom
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 13
PROGRAMMATION SHELL
SCRIPT SHELL
L'interactivité avec la commande read
# !/bin/bash
#[Link]
read -p "login: " var1
read -sp "password: " var2
echo "Votre login est: $var1 et votre mot de passe: $var2 "
./[Link]
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 14
PROGRAMMATION SHELL
SCRIPT SHELL
L'arithmétique : les instructions expr, let, bc
$(($i+1)) ou $[$i+1] ou expr $i \+ 1
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 15
PROGRAMMATION SHELL
TEST
La commande test ou [ …. ]
La commande test permet de faire un test et de renvoyer 0 si tout s'est bien passé ou 1 en cas d'erreur.
La valeur retourne se trouve dans la variable $?
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 16
PROGRAMMATION SHELL
TEST
Opérateurs de test
-e fichier si fichier existe.
-d fichier si fichier existe et est un répertoire.
-f fichier si fichier existe et est un fichier 'normal'.
-w fichier si fichier existe et est en écriture.
-x fichier si fichier existe et est exécutable.
f1 -nt f2 si f1 est plus récent que f2.
f1 -ot f2 si f1 est plus vieux que f2.
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 17
PROGRAMMATION SHELL
TEST
Opérateurs de comparaison numériques
$A -lt 5 si $A est strictement inférieur à 5
$A -le 5 si $A est inférieur ou égal à 5
$A -gt 5 si $A est strictement supérieur à 5
$A -ge 5 si $A est supérieur ou égal à 5
$A -eq 5 si $A est égal à 5
$A -ne 5 si $A est différent de 5
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 18
PROGRAMMATION SHELL
TEST
Opérateurs de comparaison de chaines chaine1 = chaine2 si chaine1 égal à chaine2
chaine1 != chaine2 si chaine1 différent de chaine2
chaine1 =~ regex si chaine1 correspond à l’expression régulière regex
chaine1 > chaine2 si chaine1 supérieur à chaine2
chaine1 < chaine2 si chaine1 inférieur à chaine2
-z chaine si la taille de la chaine est égale à zéro
-n chaine si la taille de la chaine n’est pas égale de zéro
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 19
PROGRAMMATION SHELL
TEST
touch [Link]
test -e [Link] ou [ -e [Link] ]
echo $?
test -x [Link] ou [ -x [Link] ]
echo $?
chmod a+x [Link]
test -x [Link] ou [ -x [Link] ]
echo $?
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 20
PROGRAMMATION SHELL
IF
Cette instruction sert pour les tests et branchements.
Syntaxe
if condition ; then if condition ; then if condition ; then
liste_commandes liste_commandes liste_commandes
else elif condition; then
fi
liste_commandes liste_commandes
fi else
liste_commandes
Attention !!! if [ -e file ]; fi
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 21
PROGRAMMATION SHELL
IF
Ecrire un programme qui affiche « Vous êtes l’administrateur » si vous êtes connecté en tant que root
sinon le message « Vous êtes utilisateur simple ».
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 22
PROGRAMMATION SHELL
IF
#!/bin/bash
id=`id -u`
if [ $id -eq 0 ]; then
echo "Vous êtes administrateur"
else
echo "Vous êtes utilisateur simple"
fi
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 23
PROGRAMMATION SHELL
IF
#!/bin/bash
# Authentification
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 24
PROGRAMMATION SHELL
IF
#!/bin/bash
# Authentification
read -p 'username: ' username
read -s -p 'password: ' password
if [ $username == "admin" -a $password == "secret" ]; then
echo "login/mot de passe correct"
else
echo "login/mot de passe incorrect "
fi
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 25
PROGRAMMATION SHELL
IF
#!/bin/bash
# Sauvegarde hebdomadaire
Effectuer la sauvegarde d’un dossier…. !!! La commande date
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 26
PROGRAMMATION SHELL
IF
#!/bin/bash
# Sauvegarde hebdomadaire
if [ $(date +%u) -eq 7 ]
then echo "Sauvegarde hebdomadaire"
else
echo "Sauvegarde simple"
fi
Effectuer la sauvegarde d’un dossier…. !!! La commande date
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 27
PROGRAMMATION SHELL
IF
Ecrire un programme de gestion d’un service avec IF
Le script :
- crée le fichier /tmp/[Link] s’il reçoit l’argument start
- sinon supprime le fichier /tmp/[Link] s’il reçoit l’argument stop
- sinon fait un stop puis un start s’il reçoit l’argument restart
- sinon affiche l’aide
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 28
PROGRAMMATION SHELL
CASE
Case permet de remédier aux inconvénients de if (elif)
Syntaxe:
case variable in
choix1) liste_commandes ;;
choix2) liste_commandes ;;
….
esac
« * » représente le choix par défaut.
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 29
PROGRAMMATION SHELL
CASE
Case permet de remédier aux inconvénients de if (elif)
#!/bin/bash
echo "Le contenu du répertoire courant va être affiché."
read -p "Souhaitez-vous aussi afficher les fichiers cachés (oui/non) : " choix
case $choix in
oui) ls -a;;
non) ls ;;
*) echo "Veuillez répondre par oui ou par non.";;
esac
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 30
PROGRAMMATION SHELL
CASE
case " $(groups) " in *\ admin\ *|*\ sudo\ *)
if [ -x /usr/bin/sudo ]; then
cat <<-EOF
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
EOF
fi
esac
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 31
PROGRAMMATION SHELL
FOR
Cette boucle sert pour répéter les traitements un nombre de fois connu.
Syntaxe1:
for variable in liste; do
liste_commandes
done
Exemple
for jour in lundi mardi mercredi; do
echo $jour
done
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 32
PROGRAMMATION SHELL
FOR
Syntaxe2:
for ((initialisation;condition_darrêt;incrémentation));
do
liste_commandes
done
Exemple:
for ((i=0;i<=5;i++))
do
echo $i
done
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 33
PROGRAMMATION SHELL
FOR
#!/bin/bash
#Table de multiplication
Ecrire un programme affiche la table de multiplication d’un nombre; demander à l’utilisateur de saisir une
valeur s’il ne passe pas l’argument.
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 34
PROGRAMMATION SHELL
FOR
#!/bin/bash
#Table de multiplication
if [ $# -eq 0 ]; then
echo "donner un argument"
else for i in 1 2 3 4 5 6 7 8 9; do
expr $i \* $1
done
fi
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 35
PROGRAMMATION SHELL
FOR
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 36
PROGRAMMATION SHELL
FOR
#!/bin/bash
wget -qN '[Link]
for line in $(cat [Link] | grep -i SBL | cut -f 1 -d ';')
do
if [[ $line =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$ ]]; then
iptables -A INPUT -s $line -j DROP
fi
done
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 37
PROGRAMMATION SHELL
WHILE
Cette boucle sert pour répéter les traitements un nombre de fois inconnu a priori.
Le test de continuité se fait au début de la boucle.
La boucle continue tant que la condition est vraie.
Syntaxe:
while [ condition ]
do
liste_commandes
done
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 38
PROGRAMMATION SHELL
WHILE
Exemple:
Pour faire le test de lecture d’une valeur jusqu’à ce que l’utilisateur entre la valeur 5 :
#!/bin/bash
nbm=0
while [ $nbm -ne 5 ]; do
read -p "Entrez le nombre magique pour sortir: " nbm
done
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 39
PROGRAMMATION SHELL
WHILE
Exemple:
Pour faire le test de lecture d’une valeur jusqu’à ce que l’utilisateur entre la valeur 5 :
#!/bin/bash
nbm=0
while [ $nbm -ne 5 ]; do
read -p "Entrez le nombre magique pour sortir: " nbm
done
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 40
PROGRAMMATION SHELL
WHILE
Exemple:
Lecture des lignes d’un fichier :
#!/bin/bash
file='/etc/issue'
while read line; do
echo $line
done < $file
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 41
PROGRAMMATION SHELL
SELECT
La commande select est utilisée pour demander à un utilisateur de choisir une valeur et une seule dans
une liste de valeurs prédéfinies.
L’invite à afficher est à indiquer dans la variable prédéfinie PS3.
La commande select a deux arguments : la liste des valeurs proposées, et une variable dans laquelle sera
stockée la valeur choisie.
Le numéro de la valeur choisie sera stocké dans la variable prédéfinie REPLY.
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 42
PROGRAMMATION SHELL
SELECT
Syntaxe :
select <variable> in <liste de choix>; do
liste_commandes
done
On peut sortir de la boucle avec la commande break.
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 43
PROGRAMMATION SHELL
SELECT
#!/bin/bash
PS3=" Veuillez choisir l’opération -> "
select operation in "Retrait" "Versement" " Transfert"
do
echo "Vous avez fait le choix numéro $REPLY..."
echo "Vous allez faire une opération de: $operation "
done
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 44
PROGRAMMATION SHELL
LES FONCTIONS
Fonctions
Pour déclarer une fonction, on utilise la syntaxe suivante :
maFonction() function ma_fonction {
{ instructions
instructions }
}
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 45
PROGRAMMATION SHELL
LES FONCTIONS
Fonctions
#!/bin/bash
check_fichier() {
if [ -e $fichier ]; then
echo "le fichier $fichier existe"
else
echo "le fichier $fichier n'existe pas"
fi
}
check_fichier
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 46
PROGRAMMATION SHELL
LES FONCTIONS
Fonctions
#!/bin/bash
read -p "Entrer le fichier" fichier
check_fichier() {
if [ -e $fichier ]; then
echo "le fichier $fichier existe"
else
echo "le fichier $fichier n'existe pas"
fi
}
check_fichier
MPSI1/ESMT- M. DIOKH & M. KACHALLAH 47