Vous êtes sur la page 1sur 52

SHELL SCRIPTING

Introduction
LE CODE RETOUR
Code retour
• A chaque fois qu'une commande est exécutée, elle
renvoie un code de sortie (exit code).

• Entier compris entre 0 et 255 (car codé sur 8 bits)

• Dans la plupart des langages de développement, une


commande qui s'est exécutée correctement renvoie un
code retour égal à 0.

• Si le code retour est différent de 0, alors c'est qu'une


erreur s'est passée au moment de l'exécution du code.
Le man peut vous aider
• Le man contient un certain nombre d'informations sur les
codes erreurs générés dans les différents cas.
Obtenir le code retour
• Pour obtenir le code retour de la dernière commande
exécutée, comme montré dans les précédentes vidéos,
vous pouvez utiliser le code suivant :
echo $?
Utilisation du code retour pour le ping
• On peut utiliser le code retour du ping pour vérifier la
connectivité vers un hôte de notre équipement.
#!/bin/bash

HOTE=$1
NOMBRE_DE_PAQUETS=$2
ping –c $NOMBRE_DE_PAQUETS $HOTE

if [ "$?" –ne "0" ]


then
echo "L'hote $HOTE n'est pas joignable"

else
echo "L'hote $HOTE est joignable"
fi
Créer son propre code retour
• Il est tout à fait possible de dire à votre script que dans
certaines conditions, il quitte avec un code erreur différent
de 0.

• En effet, s'il s'est correctement exécuté, il sortira avec un


code égal à 0 (ou égal à celui de la dernière commande
exécutée), mais vous pouvez lui spécifier un code
différent avec la commande : exit 1
exit 2

• Attention, car dés que la commande exit est utilisée, le


script s'arrête.
UTILISATION DU &&
Le and
• Maintenant que vous avez compris à quoi font référence
les codes erreurs, il est aisé de comprendre comment
fonctionne le &&.

• && = AND

• Il permet d'exécuter une deuxième commande


uniquement lorsque la première a renvoyé un code erreur
égal à 0 (signifiant qu'elle s'est bien exécutée).
Exemple de code
LE OU ( || )
Le OU ( || )
• II = OU

• Il permet d'exécuter une deuxième commande


uniquement lorsque la première a renvoyé un code erreur
différent de 0 (signifiant qu'elle ne s'est pas exécutée de
la bonne manière).
Exemple de code
LES FONCTIONS
A quoi servent les fonctions ?
• Permet d'écrire un block de code une fois, et de le
réutiliser par la suite dans le script.

• Eviter d'avoir à retaper du code identique, pour effectuer


plusieurs tâches similaires dans son script.

• Permet d'aérer et d'améliorer l'ergonomie du script et du


code.

• Beaucoup plus facile de faire évoluer son script par la


suite, en ajoutant d'autres fonctions.
Syntaxe
• Il existe deux manières de coder une fonction :
#!/bin/bash

#Déclarer une fonction en utilisant le mot "function"


function je-suis-une-fonction(){
command1
command2
commandn
}

#Déclarer une fonction sans spécifier le mot "function"


Je-suis-une-fonction(){
command1
command2
commandn
}
Appeler une fonction dans un script
• Il suffit d'utiliser le nom de la fonction (sans les
parenthèses) pour appeler le code qu'elle contient.
#!/bin/bash

function internet() {
ping -c 1 8.8.8.8

if [ $? -eq 0 ]
then
echo "La connectivité vers internet est
établie"
else
echo "Pas de connectivité vers internet"
fi
}

internet
Les paramètres
• Tout comme les scripts eux-mêmes, les fonctions peuvent
accepter des paramètres.
• De la même manière, le premier paramètre est stocké
dans le $1, le second dans le $2, etc…

• Attention, le $0 fait référence au nom du script lui-même


et non pas au nom de la fonction.
Utilisation de paramètres dans une
fonction

#!/bin/bash

function internet() {
ping -c $1 $2

if [ $? -eq 0 ]
then
echo "La connectivité vers internet est
établie"
else
echo "Pas de connectivité vers internet"
fi
}

Internet "1" "8.8.8.8"


Les variables
• Les variables globales peuvent tout à fait être utilisées
dans des fonctions à condition qu'elles aient été
déclarées avant la fonction.
#!/bin/bash

VARIABLE="Jordan"

function demonstration() {
echo "La variable $VARIABLE est utilisable"
}
Les variables (2)
• Cependant les variables déclarées dans une fonction ne
peuvent être utilisées qu'une fois que la fonction a été
exécutée
#!/bin/bash

VARIABLE="Jordan"

function demonstration() {
echo "La variable $VARIABLE est utilisable"
VARIABLE_IN_FUNCTION="1"
}
#VARIABLE_IN_FUNCTION n'est pas utilisable

demonstration
#VARIABLE_IN_FUNCTION est désormais utilisable
Les variables locales
• Les variables locales ne peuvent qu'être utilisées au sein
d'une fonction.
• Utilisation du mot : local
#!/bin/bash

VARIABLE="Jordan"

function demonstration() {
echo "La variable $VARIABLE est utilisable"
local VARIABLE_IN_FUNCTION="1"
}

demonstration
#VARIABLE_IN_FUNCTION n'est pas utilisable
Le code retour d'une fonction
• Les fonctions possèdent un code de retour qui peut être
explicitement indiqué grâce à la commande return.
#!/bin/bash

PRENOM="Jordan"

function demonstration() {
echo "Bonjour je m'appelle $PRENOM"
return 0
}

• Si ce code retour n'a pas été défini, alors c'est le code


retour de la dernière variable exécutée dans la fonction
qui sera celui de la fonction par défaut.
Le code retour d'une fonction (2)
• Le code retour d'une fonction est compris entre 0 et 255.
• On peut y accéder grâce à la commande $?

#!/bin/bash

function internet_connectivity() {
ping –c 1 8.8.8.8 && return 0
}

internet_connectivity

if [ $? –eq 0 ]
then
echo "Connectivité vers internet"
fi
EXERCICE 1
Script de vérification de fichier
• Réaliser le script respectant les règles suivantes :
• Script auquel on passe en argument une liste de fichiers.
• Le script va d'abord vérifier que l'utilisateur a bien saisi des
arguments au moment de lancer le script. Si ce n'est pas le cas,
alors le script sort avec une erreur 2.
• Le script va vérifier si ces fichiers existent ou n'existent pas et nous
afficher la réponse à l'écran.
• Les commandes doivent être intégrées à des fonctions. On
souhaite deux fonctions distinctes, une pour la vérification du
nombre d'arguments et l'autre pour la vérification de l'existence des
fichiers.
LES WILDCARDS
Qu'est-ce que les wildcards ?
• Il s'agit d'un caractère ou d'une chaîne de caractères qui
vont être utilisés pour prendre un certain nombre de
valeurs.

• On parle de Globbing wildcards lorsqu'ils vont matcher


avec une liste de fichiers ou de répertoires.

• Ils peuvent être utilisés avec la plupart des commandes


comme le ls ou le rm.
Liste des wildcards
• Le caractère * : match avec tous les caractères (ou
l'absence de caractères) qu'il n'y en ait qu'un seul ou
plusieurs.
Liste des wildcards
• Le caractère ? : match avec un seul caractère.
Les classes de caractères
• Il est possible de créer des patterns de recherche très
spécifiques en utilisant les classes de caractères.
• Le matching va se faire avec un ou plusieurs des
caractères inclues entre les crochets de la classe.
Les classes de caractères (2)
• Il est également possible d'exclure un certain nombre de
caractères grâce au ! (par exemple [!oe])
Les classes de caractères (3)
• On peut créer une plage de caractère grâce aux classes
en utilisant le caractère –
• [1-3]* : match avec tous les fichiers commençant par 1, 2 ou 3
• [a-c]* : match avec tous les fichiers commençant par a, b, ou c
Les classes de caractères (5)
• Il existe des classes de caractères prédéfinies.

• [[:alpha:]] : toutes les lettres de l'alphabet (minuscules et


majuscules)
• [[:alnum:]] : toutes les lettres de l'alphabet (minuscules et
majuscules) ainsi que tous les chiffres (0 à 9)
• [[:digit:]] : tous les chiffres de 0 à 9
• [[:upper:]] : toutes les lettres de l'alphabet en majuscule
• [[:lower:]] : toutes les lettres de l'alphabet en minuscule
• [[:space:]] : tous les caractères d'espacement (espace,
tabulation, nouvelle ligne, etc…)
Utilisant des caractères du type wildcard
• Si on veut effectuer des recherches sur des fichiers qui
comportent un caractère de type wildcard, il faut utiliser le
caractère d'échappement \ avant le wildcard.
• \?
CASE
Une alternative au if
• Lorsque l'on souhaite faire des conditions complexes, à
savoir plusieurs elif comme par exemple ci-dessous :
#!/bin/bash

read –p "Quel est votre age ?" AGE

if [ $AGE –lt 18 ]
then
echo "Vous êtes mineur"
elif [ $AGE –gt 18 ]
then
echo "Vous êtes majeur"
elif [ $AGE –eq 18 ]
then
echo "vous êtes majeur et vous avez 18 ans"
fi
Mettre en place le case
• Voici la syntaxe du case
case "$VARIABLE" in
premier_cas)
commande1
commande2
commanden
;;
deuxieme_cas)
commande1
commande2
commanden
;;
troisieme_cas)
commande1
commande2
commanden
;;
esac
Mettre en place le case - Exemple

case "$1" in
start)
/etc/init.d/apache2 start
;;
stop)
kill $(cat /var/run/apache2/apache2.pid)
;;
*)
echo "Merci d'indiquer start ou stop"
exit 1
;;
esac
Mettre en place le case – Exemple 2

case "$1" in
start|START)
/etc/init.d/apache2 start
;;
stop|STOP)
kill $(cat /var/run/apache2/apache2.pid)
;;
*)
echo "Merci d'indiquer start ou stop"
exit 1
;;
esac
Mettre en place le case – Exemple 3

case "$1" in
[sS][tT][aA][rR][tT])
/etc/init.d/apache2 start
;;
[sS][tT][oO][pP] )
kill $(cat /var/run/apache2/apache2.pid)
;;
*)
echo "Merci d'indiquer start ou stop"
exit 1
;;
esac
Exercice
• Faire un script prenant deux arguments :
• Premier argument : nom d'un fichier
• Deuxième argument : peut prendre plusieurs valeurs
comme
• copy (copie le fichier dans le répertoire /tmp/script)
• delete (supprime le fichier)
• read (lire le fichier).

• Il faudra créer une fonction qui vérifiera que le fichier


rentré en argument existe bien, et utiliser les case pour
les différentes possibilités).
MESSAGES DE LOGS
Qu'est-ce que les logs ?
• Ce sont des messages émis par le système se présentant
sous la forme d'un fichier texte reprenant
chronologiquement les évènements qui ont affecté le
système.

• Les logs peuvent ainsi aider à déterminer quelles erreurs


se sont produites et à quel moment.

• On peut ainsi en savoir plus sur qui, quoi, ou, quand, et


pourquoi.

• Les fichiers de logs sont principalement situés dans le


répertoire /var/log.
Les fichiers de logs
• Le système de syslog • Le système de syslog
catégorise les messages catégorise les messages
selon leur sévérité : selon l'émetteur
• Emergency : très urgent • Kernel
• Alert • User
• Critical • Mail
• Error • Daemon
• Warning • Authentifcation
• Notice • Local0 (Custom)
• Information • Local1 (Custom)
• Debug • …
• Local7 (Custom)
Commandes
• Vous pouvez utiliser plusieurs commandes pour effectuer
du logging :

• Message "User" de niveau de sévérité "Notice"

logger "Message à ajouter aux logs du système"

• Message "local5" de niveau de sévérité "Information"

logger -p local5.info "Message à ajouter aux logs du


système"
Commandes
• Message "local0" de niveau de sévérité "info", tagué par
le mot clé : exercice4 (utile pour retrouver les lignes
générées par le script, dans le fichier de logs)
Logger –t exercice4 –p local0.info "Message à ajouter
aux logs du système"

• Message "local5" de niveau de sévérité "alert" et incluant


le pid (numéro de processus)

logger -i -p local5.alert "Message à ajouter aux logs


du système"
UTILISATION DU YAML
YAML (YAML Ain't Markup Language)
• Langage permettant de représenter des données
structurées (à la manière du XML)

• Langage développé pour être lisible facilement par des


humains, et compatible avec la plupart des langages de
développement actuels.
Utilité du YAML
• Ce langage nous permet d'associer des variables à des
valeurs facilement.

• Ici on a associé la variable :


• "nom" à la valeur "ASSOULINE"
• "prenom" à la valeur "Jordan"
• "profession" à la valeur "formateur"
• "age" à la valeur "28"
La fonction parse_yaml()
• Le YAML est un langage peu utilisé en bash et à tort.

• Voici la fonction permettant de lire un fichier yaml


parse_yaml() {
local prefix=$2
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 |
awk -F$fs '{
indent = length($1)/2;
vname[indent] = $2;
for (i in vname) {if (i > indent) {delete vname[i]}}
if (length($3) > 0) {
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
}
}'
}
Syntaxe
• Une fois la fonction parse_yaml déclarée :
parse_yaml() {
……………………………
}

eval $(parse_yaml config.yml "config_")

• Parse_yaml étant la fonction


• Config.yml étant le fichier yaml
• Config_ étant le préfixe qui sera associé à toutes les
variables.

Vous aimerez peut-être aussi