Vous êtes sur la page 1sur 54

Université Abdelmalek Essaadi

Ecole Nationale des Sciences Appliquées Al Hoceima

Partie 5: Programmation Shell

Mohamed CHERRADI
Ingénieur d’Etat en Informatique
Email: mcherradi.ensah@gmail.com

Année Universitaire 2022 / 2023


2

Programmation Shell
Plan
3
1. Introduction
2. Qu’est-ce que le shell ?
3. Qu'est-ce qu'un script shell ?
4. Structure script shell.
5. Exécution d'un script
6. Les variables
7. La commande d’entrées-sorties read
8. La commande readonly
9. Arguments ligne de commande
10. Structures de contrôle conditionnelles & repetitive
11. Les Tableaux
12. Les fonctions
Introduction
4

 Utiliser un interprèteur de commandes (ou Shell en anglais) qui permet


d’interagir avec la machine via des commandes .
 L'exécution de commandes permet 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 des
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.
Qu’est-ce que le shell ?
5

 Le shell est un programme exécutable en mode terminal, dont la principale


fonction est de permettre à l'utilisateur d'interagir avec le système via un
terminal.
 Il est parfois appelé interpréteur de commandes.
 Les fonctionnalités offertes par l'invite de commande peuvent varier en fonction
du shell que l'on utilise. Les principaux sont :
 sh : Bourne Shell. L'ancêtre de tous les shells.
 bash : Bourne Again Shell. Une amélioration du Bourne Shell, disponible
par défaut sous Linux et Mac OS X.
 ksh : Korn Shell. Un shell puissant présent sur les Unix propriétaires, mais aussi
disponible en version libre, compatible avec bash.
 csh : C Shell. Un shell utilisant une syntaxe proche du C.
 tcsh : Tenex C Shell. Amélioration du C Shell.
 zsh : Z Shell. Shell assez récent reprenant les meilleures idées de bash, ksh et tcsh
Qu’est-ce que le shell ?
6

 Deux modes d'utilisation :


 Interactif : l'utilisateur saisit et exécute ses lignes de
commandes une par une dans un terminal
 Non interactif : le shell lit un ensemble de commandes à partir

d'un fichier appelé shell 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.
Qu'est-ce qu'un script shell ?
7
 Un script Shell est un fichier texte simple contenant une suite de
commandes SHELL, exécutable par l'interpréteur, comme par exemple:
/bin/bash.
 Il peut donc être écrit avec n'importe quel éditeur de texte avec un nom
comporte parfois l'extension .sh.
 Le principal itéré d'un script shell et d'automatiser des actions répétitives
sur un système Linux.
 Dans un script Shell on peut définir des variables et utiliser des
structures de contrôle, ce qui lui confère le statut de langage de
programmation interprété.
 Le langage Shell gère notamment :
 la gestion des entrées-sorties et de leur redirection.
 des variables définies par le programmeur et des variables systèmes.
 le passage de paramètres .
 des structures conditionnelles et itératives des fonctions internes.
Structure script shell
8

Shebang
 Le script débute généralement par l'indication de son interpréteur
écrite sur la première ligne : Shebang.
 Le shebang, représenté par #!, est un en-tête d'un fichier texte qui
indique au système d'exploitation que ce fichier n'est pas un fichier
binaire mais un script.
 Cette ligne précise l'interpréteur permettant d'exécuter ce script.
#! /bin/bash
 Pour utiliser par exemple tcsh, alors il faut écrire :
#! /bin/tcsh
Structure script shell
9

Commentaires
 Les lignes commençant avec un # (à l'exception de #!) sont des
commentaires et ne seront pas exécutées.

# Cette ligne est un commentaire.

 Attention: Un commentaire ne peut pas être suivi d'une commande


sur la même ligne. Il n'existe pas de façon de terminer le
commentaire, pour que le "vrai code" commence dans la même
ligne. Utiliser une nouvelle ligne pour la commande suivante.
Structure script shell
10

La commande echo
 La commande echo permet d'afficher l'expression donnée en
paramètre. Cette dernière peut être :
 Soit une variable
 Soit une chaîne
 Soit une expression composée de chaines et de variables.

 Exemples:
echo "Bonjour... "
echo "Comment allez-vous ?"
Structure script shell
11

La commande echo
 l'option -n empêche le passage à la ligne
Exemple:
echo -n "Nous sommes le " ; date
// le ; sert de séparateur des commandes sur la ligne
 La séquence de caractères \t permet d'insérer une tabulation. Pour que cette dernière soit
reconnue, il est nécessaire d'utiliser l'option -e.
Exemple:
echo -e "\t une tabulation avec echo"
 Il est possible d'insérer une nouvelle ligne avec la séquence de caractères \n. Pour que la cette
séquence soit reconnue, utilisez l'option -e
Exemple:
echo -e "ligne 0 \n ligne 1 \n ligne 2"
Structure script shell
12

Exemple:

script0.sh
Exécution d'un script
13

 Avant toute chose, il faut rendre un script exécutable. il s'agit d'utiliser


la commande chmod.
chmod +x script0.sh
 Trois solutions sont possibles pour exécuter un script:
En utilisant ./ si l'on se trouve dans le répertoire du script :

Exemple: user1$ ./script0.sh
 ou en spécifiant le chemin absolu :

Exemple: user1$ /home/user1/dos1/script0.sh


 Une dernière solution est d'appeler directement l'interprète et de lui

transmettre le script à exécuter.


Exemple: user1$ bash script0.sh
Les variables
14

 Une variable stocker temporairement des informations en mémoire.


C'est en fait la base de la programmation.
 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
 Une variable est l'assignation d'une étiquette à un contenu.
 Ce contenu peut changer autant que l'on veut .
 Il existe deux types de variables en shell:
 Les variables définies explicitement par l'utilisateur.
 Les variables d'environnement
Les variables
15

Les variables définies par l’utilisateur


 L'utilisateur peut déclarer facilement de nouvelles variables Par
l'affectation directe d'une valeur.
Syntaxe : nom=valeur
 La valeur de la variable peut être numérique ou être une
chaîne de caractère, leur format n'a pas d'importance
Attention : pour une affectation, il ne doit pas y avoir
d’espace entre le nom de la variable, le signe = et la
valeur.
 Exemple: titre= 'les shell scripts'
soustitre="les variables"
Les variables
16

Les variables définies par l’utilisateur


 Pour manipuler les variables il faut les préfixer du symbole $
Exemple:
#! /bin/bash
message='Bonjour'
echo $message
Les variables
17

Les variables définies par l’utilisateur


 Opération sur les variables :

 L'addition : +
 La soustraction : −
 La multiplication : ∗
 La division : /
 La puissance : ∗∗
 Le modulo : %
Les variables
18

Les variables définies par l’utilisateur


 Opération sur les variables :
 La commande let:
En bash, les variables sont tous des chaînes de caractères
⇒Incapable de manipuler des nombres ⇒ pas opérations.

La commande let réalise des opérations arithmétiques sur des


variables.
Les variables
19

Les variables définies par l’utilisateur


 Opération sur les variables :
 Exemple:
#! /bin/bash
a=1 # a contient 1
let a ++ # a contient 2
let b = 3*$a # b contient 6
Let c = $a - $b # c contient -4
Les variables
20

Les variables d’environnement


 Le Shell possède des variables d'environnement qui permettent de garder en
mémoire des informations importantes telles que:
 le login de l'utilisateur (stocké dans la variable $USER)
 son répertoire de connexion ($HOME).

 la liste des répertoires dans lequel aller chercher les exécutables des

commandes externes ($PATH)


 $TERM: afficher le type de terminal utilisé

 $SHELL: nom du shell utilisé.


 En bash, on peut définir des variables et les consulter de la façon suivante :
export VAR="ma variable"
 La commande env affiche la liste de toutes les variables d'environnement du Shell
avec leurs valeurs.
Les variables
21

Les quotes
 Les apostrophes ‘: une chaîne de caractères mise entre simple quotes ne sera pas
interprétée par le shell
 Les guillemets " : seuls les métacaractères ($) sont interprétés, les autres ne seront
pas interprétés.
 Les accents graves `: un texte entre quotes inversés est considéré comme une
commande à exécuter.
 Exemples :
 echo ‘ceci est une chaine de caractères non interprétée‘
 echo "pwd"
 echo " Le répertoire courant de l'utilisateur $user est `pwd` "
Les variables
22

Affectation du résultat d'une commande


 Les résultats de commande : par exemple ls sont des chaines de caractères et il est donc
possible de les stocker dans une variable. De manière générale, cela se fait de la manière
suivante:
VARIABLE=$(commande)
ou
VARIABLE=`commande`

 Exemple :
CONTENU=$(ls)
ou
CONTENU=`ls`
La commande d’entrées-sorties read
23

 L'instruction read permet de créer des scripts interactifs, read lit une
ligne en provenance de l'entrée standard (par défaut le clavier) et
alimente à partir de cette dernière des variables. read attend que
l‟utilisateur entre une valeur.
Syntaxe: read nom_variable1 nom_variable2 …
 Exemple d’un script shell utilisant read:
#! /bin/bash
echo "Salut... Entrer une valeur svp"
read valeur
echo "Merci, la valeur que vous avez tapé est: $valeur"
La commande d’entrées-sorties read
24

 Les options
 L'option -t timeout permet d'indiquer un délai maximum
d’attente avant que read ne retourne une erreur.
 Exemple:

#! /bin/sh
echo "entrer une valeur:"
read -t 5 valeur
La commande d’entrées-sorties read
25

 Les options
 -n nchars: Cette option indique à read le nombre de caractères à
lire.
 Exemple:
#!/bin/bash
echo "entrer une valeur:"
read -n 10 valeur
La commande readonly
26

 L'instruction readonly permet de créer des variables dont la valeur


ne peut plus être modifiée.
Syntaxe: readonly variable=valeur
Exemple:
#!/bin/bash
readonly var=variable1
echo $var #afficher: variable1
var=variable2 #afficher: su: var : variable en lecture seule
Les paramètres d’une ligne de
27
commande
 la plupart des commandes Linux peuvent être suivies d'un ou plusieurs paramètres, qui
peuvent être des options, des noms de fichiers ou de répertoires, etc.
 Il est aussi possible de passer des paramètres à scripts.
./varparam.sh param1 param2 param3
 Pour les manipuler, il existe plusieurs variables spéciales.
En particulier :
 $# : contient le nombre de param.

 $0 : contient le nom du script exécuté (ici "./varparam.sh")

 $* : la liste des arguments.

 Les paramètres formels (arguments) d'un script sont $1 $2 $3... ce sont des paramètres
positionnels
 $1 : contient 1er param.

···
 $9 : contient 9éme param
Lesparamètres d’une ligne de commande
28

 Exemple:
#! /bin/bash
# affiche_param.sh
echo "Le 1er paramètre est : $1"
echo "Le 3ème paramètre est : $3"
echo "Le 10ème paramètre est : ${10} "
echo "Le 15ème paramètre est : ${15} "
 Il suffit alors d'invoquer le script en lui passant un certain nombre de paramètres :
./affiche_param.sh un 2 trois 4 5 6 7 8 9 dix 11 12 13 14 quinze 16 17
Le 1er paramètre est : un
Le 3ème paramètre est : trois
Le 10ème paramètre est : dix
Le 15ème paramètre est : quinze
Structures de contrôle conditionnelles
29

 Les structures de contrôle permettent au programmeur de contrôler l'exécution de


certaines portions du programme en fonction de conditions telles la valeur d'une
variable, l'exécution d'une commande, la présence d'un fichier et autres. I

 Il existe deux types de structures de contrôle soit:


 les structures de test(if et case)
 les structures de répétition (for, while et until).
Structures de contrôle conditionnelles
30

les structures de test(IF):


 La structure de contrôle if permet de réaliser des tests. La commande située
à droite du if est exécutée.
 Syntaxe 1:  Syntaxe 2:  Syntaxe 3:
if condition ; if condition ; if condition ;
then then then
instruction1 instruction 1 instruction 1
instruction2 instruction 2 instruction 2
fi else elif condition2 ;
instruction 3 then
instruction 4 instruction 3
fi instruction 4
else instruction 3
Le mot clé fi permet de fermer la structure de contrôle if. fi
Le mot clé elif n'a pas de fermeture.
Structures de contrôle conditionnelles
31

 Opérateurs de comparaison
 3 types de tests différents en bash :

• Tests sur des nombres.

• Tests sur des chaînes de caractères.

• Tests sur des fichiers


Structures de contrôle conditionnelles
32

 Opérateurs de comparaison
 if [ $a -eq $b ] teste l'égalité des entiers contenues dans les variables $a et $b. Si tel
est le cas, renvoie vrai et faux sinon.
 if [ $a -ne $b ] teste si les deux opérandes entiers sont différents
 if [ $a -lt $b ] teste si $a est strictement plus petit que $b (ce sont des entiers) (-le pour
inferieur ou egal).
 if [ $a -ge $b ] teste si $a est supérieur ou égal á $b (ce sont des entiers) (-gt
pour strictement supérieur ) .
 if [ $a = $b ] teste si les deux opérandes chaînes de caractères sont égaux
 if [ $a != $b ] teste si les deux opérandes chaînes de caractères sont différents .
 if [ -n $a ] teste si la chaîne $a n‟est vide.
 if [ -z $a ] teste si chaîne $a est vide
 if [ -e $HOME/fich] teste si le fichier $HOME/fich existe
 if [ -L truc ] teste si truc est un lien symbolique
Structures de contrôle conditionnelles
33

 Opérateurs de comparaison
 if [ -f fich ] teste si fich est un fichier régulier
 if [ -d dir ] teste si dir est un répertoire
 if [ -r fich] Teste si fich est accessible en lecture.
 if [ -w fich] Teste si fich est accessible en écriture.
 if [ -x fich] Teste si fich est accessible en exécution.
 if [ -s fich] Teste si fich est non vide
 if [$fich1 -nt $fich2] Teste si fich1 est plus récent que fich2.($fich1 -ot $fich2 (older
than))
Structures de contrôle conditionnelles
34

 Exemple1:  Exemple2:  Exemple3:


# !/bin/bash #! /bin/bash # !/bin/bash
if [ -f /etc/passwd ] if [ -r /etc/passwd ] if [ $# -eq 0 ] ;
then then then
echo "Le fichier existe" echo "le fichier /etc/passwd echo ”pas de parametres”
fi est accessible en lecture" elif [ $# -eq 1 ] ;
fi then echo ”1 parametre”
elif [ $# -eq 2 ] ;
then echo ”2 parametres”
else
echo ”plus de deux parametres”
fi
Structures de contrôle conditionnelles
35

Effectuer plusieurs tests à la fois


 Dans un if, il est possible de faire plusieurs tests à la fois.
 Si un test est vrai ET qu‟un autre test est vrai : &&
 Si un test est vrai OU qu‟un autre test est vrai :||
 Syntaxe1:  Syntaxe2:
if condition1 && conditiom2 if condition1|| conditiom2
then then
instructions; instructions;
fi fi

 Encadrer chaque condition par des crochets


Structures de contrôle conditionnelles
36

 Exemple1:  Exemple2:
#! /bin/bash #! /bin/bash
read x read x
if [ $x-eq 5 ] || [ $x-eq 4 ] if [ $x -lt 127 ] && [ $x -gt 0 ]
then then
echo ok echo "La variable x est comprise
fi entre 0 et 127"
fi
Structures de contrôle conditionnelles
37

les structures de test (Case):


Elle permet d'orienter la suite du programme en fonction d'un choix de différentes
valeurs.

Syntaxe:

case chaine in
motif_1) instruction1;;
motif_2) instruction2;;
...
motif_k) instructionk;;
esac
Structures de contrôle conditionnelles
38

les structures de test (Case):


Exemple:
#!/bin/bash
echo -n "Entrez un nombre :"
read nombre
case$nombre in
# Si $nombre = 1
1) echo "Vous avez tapé 1";;
# Si $nombre = 2
2) echo "Vous avez tapé 2";;
# Pour le reste des valeurs de $nombre
*) echo "Vous n'avez tapé ni 1 ni 2";;
esac
Structures de contrôle conditionnelles
39

 les structures de répétition(for)


Une boucle est un bloc de code qui répète une liste de commandes
aussi longtemps que la condition de contrôle de la boucle est vraie.

Syntaxe:
for variable in ‟valeur1‟ ‟valeur2‟ ‟valeur3‟
do
echo "La variable vaut $variable"
done
Structures de contrôle conditionnelles
40

 les structures de répétition (for)


Exemples:
Exécuter une boucle for sur le contenu d'un dossier :
#! /bin/bash
for i in `ls`; do
echo "ligne : "$i;
done
Recopier les fichiers personnel de toto dans /tmp/toto
for fich in /home/toto/* do
cp $fich tmp/toto
done
Exécuter une boucle for sur un compteur croissant :
#! /bin/bash
for (( i=1; i<=10; i++ ))
do
echo "Compte : "$i;
done
Structures de contrôle conditionnelles
41

 les structures de répétition (While)


La boucle while répète une séquence d'opérations tant que la condition
testée est vrai.

Syntaxe: while condition


do
opération(s)
done
Structures de contrôle conditionnelles
42

 les structures de répétition (While)


Exemples:
#!/bin/bash
nbr=0
while [ nbr!=53 ]
do
echo -e "Saisir 53 : \n"
read nbr
done
Tableaux
43

 Un tableau est une variable contenant d'autres variables rangée en


mémoire les unes à la suite des autres.
 Chaque variable contenue dans le tableau est nommée par le numéro
de sa case et affectée d'une valeur (le contenu de sa case).
 L'indice est le numéro de la case.
 Appeler l'indice d'une case permet d'appeler la valeur
correspondante à cette case : on dit déréférencer l'élément du
tableau.
Tableaux
44

Initialisation du tableau
 Chaque case (ou valeur) présente dans un tableau sera initialisée de
la façon suivante : nom_tableau[Numéro]=valeur
 tab[0]="bonjour";
// Mettre la valeur "bonjour" dans la case numéro "0" (la première) du tableau "tab«
Tableaux
45

Créer un tableau
Quatre méthodes pour créer un tableau:
 La création d'un tableau indicé peut se faire simplement par
initialisation, en fournissant ses éléments entre parenthèses :
tableau_indi=( "un" "deux" "trois" "quatre" )

 Les indices sont ici assignés automatiquement, en commençant par


0. On peut aussi l'initialiser avec des indices imposés:
tableau_indi=( " un " " deux " [42]=" Quarante deux" " x" )
Dans cet exemple, l'indice 0 vaut un, le 1 deux, le 42 quarante deux et
le 43 x (les valeurs des autres indices sont la chaîne vide).
Tableaux
46

Créer un tableau
 Avec la commande declare et l'option -a

declare -a nom-tableau=(valeur0 valeur1 valeur2 ...)

 Avec la commande read :les valeurs sont données via le terminal par
l'utilisateur.

read -a nom-tableau
Tableaux
47

Lecture simple
 Pour lire les valeurs et les différentes cases d'un tableau, il nous faut
faire de la même manière que pour une variable simple mais en
spécifiant le numéro de la case voulue, comme suivant : ${tab[indice]}
exemple : echo ${tab[1]}
 Tous les éléments d'un tableau sont accessibles avec la syntaxe :
${tab[*]}
 Le nombre d'éléments d'un tableau est accessible par la syntaxe :
${#nomtableau[*]}.
 Il est possible de récupérer le numéro des cases qui ont été utilisées
dans un tableau avec la syntaxe :${!nom-tableau[*]}
Tableaux
48

 Parcours du tableau avec une boucle


for mot in ${tab[*]}
do
echo $mot;
done
 Concaténer deux tableaux en un seul
Concaténer dans un seul tableau nouvellement initialisé les cases de
tableaux existants :
nom-tableau3=("${nom-d-un-tableau1[*]}" "${nom-d-un-tableau2}" ...)
Tableaux
49

Exemple:
#!/bin/bash for mot in ${tableau[*]}
array=([2]=nom1 nom2 [6]=nom3) #1
do
for mot in ${array[*]}
do echo $mot;
echo $mot; done
done
tb=(nom1 nom2 nom3)
for mot in ${tb[*]}
do
echo $mot;
done
declare -a tab=(nom1 nom2 nom3)
for mot in ${tab[*]}
do
echo $mot;
done
read -a tableau
Les Fonctions
50

 Une fonction regroupe un certain nombre de commandes qui sont


exécutées plus d'une fois dans un script.
 Les deux syntaxes suivantes sont équivalentes : les parenthèses ou le
mot-clé function indiquent au shell que Nomfonct est une fonction.

Nomfonct (){ function Nomfonct {


commandes commandes
} }
Les Fonctions
51

 L'utilisation des fonctions se fait en deux moments :


 d'abord, il faut définir la fonction : vous décrivez quelle série
de commandes il faudra exécuter lorsque l'on appellera la
fonction ;
 ensuite, il faut appeler la fonction à chaque endroit que vous
voulez.
Les Fonctions
52

Déclaration:
 Pour déclarer une fonction, on utilise la syntaxe suivante:
maFonction() {
instructions
}

 La déclaration d'une fonction doit toujours se situer avant son


appel.
Les Fonctions
53

Appel et paramètres:
 Pour appeler une fonction, on utilise la syntaxe suivante:
maFonction param_1 param_2 ... param_n

 La déclaration d'une fonction doit toujours se situer avant son


appel.
Les Fonctions
54

return :
la commande qui permet de retourner le code d'erreur d'une fonction
dans un script (une valeur entre 0 et 255). Cette commande met fin à
l'exécution de la fonction.
Exemple:
#! /bin/bash
Function fonct() {
if [ -e $1 ]
then
 ./exempleFonct.sh
echo "le fichier existe"
return 0
else
return 1
fi
}
fonct fich1

Vous aimerez peut-être aussi