Vous êtes sur la page 1sur 17

CHAPITRE 5 

INITIATION À LA PROGRAMMATION SHELL

I. Objectif du chapitre :
A la fin de ce chapitre, les étudiants seront capables de connaître l’utilisation des
commandes Shell sous linux.
II. Plan du chapitre :
1. Introduction
2. Initialisation d’un shell
3. Les variables
a. Les variables d’environnement
b. Les variables spéciales $
4. Les scripts
Initiation à la programmation Shell Version 2015
a. Définition
b. La commande read
c. La commande echo
5. Les structures de contrôles
a. La commande test
b. Le test if
c. Le test case
6. Les structures de boucle
7. Exportation de variables

[4
8]
1. INTRODUCTION

Le shell est l’interface Homme/Machine d’UNIX. Il en existe plusieurs qui diffèrent par
la syntaxe mais aussi par les services offerts. Le shell a un double rôle, celui
d’interpréteur de commandes mais aussi celui d’un langage de programmation et à ce
titre, il gère des variables et des fonctions et dispose de structures de contrôle (boucles,
conditionnelles ….). Ces fonctionnalités servent essentiellement pour l’écriture de
procédures (shells scripts) qui permettent à chacun de paramétrer une session et
développer ses propres outils.

2. INITIALISATION 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.

Initiation à la programmation Shell Version 2015


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

[4
9]
3. LES VARIABLES :
A. LES 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
Remarque :

La commande env permet d’afficher l’ensemble des variables d’environnement pour le


shell actif.

B. LES VARIABLES
Initiation à la programmation Shell SPÉCIALES $ : Version 2015

 ? : 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.

[5
0]
Exemple :

$ a=salle

$ b=informatique

$ echo $a

salle

$ env

HOME=/home/soufiene

…..

….

LOGNAME=toto

PATH=/usr/bin/:/home/soufiene/bin:.

SHELL=/bin/bash

$ set

Initiation à la programmation Shell


HOME=/home/soufiene Version 2015
…..

LOGNAME=soufiene

PATH=/usr/bin/:/home/soufiene/bin:.

SHELL=/bin/bash

a=salle

b=informatique

4. LES SCRIPTS :
A. DÉFINITION :

Un script est un fichier texte contenant des commandes ou des instructions. En


effet, on peut avoir la dans du shell, des variables, des structures de contrôles, des
structures répétitives…etc d’où l’appellation script shell.

[5
1]
B. LA COMMANDE READ :

La commande read lit la saisie de l’utilisateur à partir du canal d’entrée standard et


stocke ces données dans des variables du shell. Les noms de ces variables sont transmis
comme paramètres de read dont la syntaxe est la suivante : read var1 [var2 …]. Lorsque
read est traité, le shell attend une entrée de la part de l’utilisateur.

$cat lecture.sh

echo ”saisir le contenu des variables a et b ”

read a b

echo ”a = $a”

echo ”b = $b”

$lecture.sh

saisir le contenu des variables a et b

15

Initiation à la programmation
salut Shell Version 2015

a = 15

b = salut

C. 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.

Exemple : voir l’exemple ci dessus.

[5
2]
5. LES STRUCTURES DE CONTRÔLES :
A. LA COMMANDE TEST

Elle permet d’effectuer des tests de comparaison, en retournant un code de sortie, dans la
variable spéciale ?, égal à zéro lorsque la comparaison est vraie, égal à 1 si faux et une autre
valeur sinon.

 Syntaxe est la suivante : test [expression]


Options courantes :

 ch1 = ch2 : chaînes de caractères ch1 et ch2 identiques


 ch1 != ch2 : chaînes de caractères ch1 et ch2 différentes
 nb1 –eq nb2 : nombres nb1 et nb2 égaux
 nb1 –ne nb2 : nombres nb1 et nb2 différents
 nb1 –gt nb2 : nb1 > nb2
 nb1 –ge nb2 : nb1 >= nb2
 nb1 –lt nb2 : nb1 < nb2
Initiation à la programmation Shell Version 2015
 nb1 –le nb2 : nb1 <= nb2
 -r fic : vrai si fic existe et est lisible
 -w fic : vrai si fic existe et est accessible en écriture
 -x fic : vrai si fic existe et est exécutable
 -f fic : vrai si fic existe et est un fichier ordinaire
 -d fic : vrai si fic existe et est un répertoire
 -a : opérateur logique ET
 -o : opérateur logique OU
Remarques :

 Pour des comparaisons complexes, on peut utiliser des parenthèses précédées de


caractère \. Par exemple l’expression : !comparaison1 –a comparaison2 peut être
écrite :
!\(comparaison1 –o comparaison2\)

 Pour tester si la variable chaîne a comme valeur la chaîne vide, on ne peut pas
écrire:
[5
3]
test $chaîne = ‘ ‘, car si cette chaîne est vraiment vide et après évaluation des méta-
caractères, cette commande sera évalué sous la forme : test = ‘ ‘ qui est incorrecte.

L’introduction de la syntaxe suivante pour tester si chaîne est une chaîne vide :

Exemple

test $chaîne

soufiene@linuxpc$ test $USERNAME = rs1

soufiene@linuxpc$ echo $?

0: le contenu de la variable USERNAME égal à rs1

1: le contenu de la variable USERNAME différent de rs1

B. LE TEST IF :

La syntaxe est la suivante:

if condition1

then
Initiation à la programmation Shell Version 2015
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.

[5
4]
$ cat afficrep.sh

# Ce script affiche le contenu du répertoire donné en

paramètre. S’il n’y a pas exactement #un paramètre, un

message est affiché

if test $# -eq 1

#on peut écrire aussi if test [ $# -eq 1]

then

echo ”le répertoire $1 a le contenu suivant : ‘ls $1’ ”

else

echo ”mauvais nombre de paramètre ”

fi

$ fic /home

Initiation Remarque :
à la programmation Shell Version 2015

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

[5
5]
liste_commande2

fi

C. LE TEST CASE :

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 :

$cat script2.sh

..............
Initiation à la programmation Shell Version 2015
#si le contenu de la variable var égal à celui de var1,

#liste_com1 #est exécutée, sinon liste_com2 est exécutée

case $var in

$var1) liste_com1 ;;

*) liste_com2 ;;

Esac

Exemple 2 :

$cat script.sh

...............

#si le contenu de la variable var est égal à celui de var1,

#liste com1 est exécutée, sinon si son contenu commence par

#les caractères “com” liste_com2 est exécutée

case $var in

$var1)liste_com1 ;;

[5
6]
com*)liste_com2 ;;

esac

6. LES STRUCTURES DE BOUCLE :

Dans un script, il est possible de répéter plusieurs commandes en utilisant les structures de
boucle for, while ou until.

A. LA BOUCLE FOR :

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
Initiation à la programmation Shell Version 2015
liste_commandes

done

La liste de commandes sera exécutée autant de fois que ce contient la liste en nombre
d’éléments.

Exemples :

$cat proc

mot1=bonjour

mot2=hello

for var in $mot1 $mot2 $1 salut

do

echo $var

done

[5
7]
$proc bonsoir

Bonjour

Hello

Bonsoir

Salut

$cat changemode

#changer les droits d’accès à rwxr-xr-x pour tous les

#fichiers du répertoire courant commençant par

#l’extension ‘.c’

for fichier in ‘ls *.c’

do

chmod 755 $fichier

done

Initiation à la programmation Shell Version 2015


B. LA BOUCLE WHILE :

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.

C. LA 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.

[5
8]
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.

Exemple :

$cat execute.sh

#exécute un ensemble de commandes sur tous les fichiers

du répertoires courant sauf le fichier “fic”

for f in $*

# on abrévie par
Initiation à la programmation : for f
Shell Version 2015
do

if test $f = “fic”

then

continue

# passage à la valeur suivante de f

fi

# commandes à exécuter

done

$cat readchoice.sh

#boucle de lecture avec sortie si la réponse est q, sinon

#exécuter la liste des commandes

while read x

do

if test $x = “q” then

[5
9]
break

# sortie de la boucle

fi

………

#liste de commandes à exécuter

Done

7. EXPORTATION DE VARIABLES :

Une variable est locale à un processus et elle n’est pas automatiquement connue dans les
processus crées pour exécuter des commandes ou des scripts. Certaines variables prédéfinis sont
automatiquement exportées par le shell (comme HOME). Pour exporter une variable on utilise la
fonction export avec en argument les variables concernées. Sans paramètre, export affiche la liste
des variables exportées.

Initiation à la programmation Shell Version 2015


$ cat exemple

echo "Dans cet exemple, v=$v "

$ v=oui

$ exemple

Dans exemple, v=

$ export v

$ exemple

Dans exemple, v=oui

[6
0]
Institut Supérieur des Etudes Technologiques de Tozeur

Département Technologies de l’informatique

Systèmes d’exploitation 2

TD N° 5 : Programmation Shell

Exercice 1 :

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".

Correction
Initiation à la programmation Shell Version 2015
MOIS=$(date +"%m")

case $MOIS in

01) NOM="janvier";;

02) NOM="fevrier";;

03) NOM="mars";;

04) NOM="avril";;

05) NOM="mai";;

06) NOM="juin";;

07) NOM="juillet";;

08) NOM="aout";;

09) NOM="septembre";;

10) NOM="octobre";;

11) NOM="novembre";;

12) NOM="decembre";;

[6
1]
esac

ANNEE=$(date +"%Y")

case $MOIS in

01|03|05|07|08|10|12)

echo "31 jours en "$NOM" "$ANNEE;;

04|06|09|11)

echo "30 jours en "$NOM" "$ANNEE;;

02)

BISSEXTILITE=$(expr $ANNEE % 4)

if [ $BISSEXTILITE != 0 ]

then

echo "28 jours en "$NOM" "$ANNEE

else

BISSEXTILITE=$(expr $ANNEE % 100)

if [ $BISSEXTILITE != 0 ]
Initiation à la programmation Shell Version 2015
then

echo "29 jours en "$NOM" "*ANNEE

else

BISSEXTILITE=$(expr $ANNEE % 400)

if [ $BISSEXTILITE != 0 ]

then

echo "28 jours en "$NOM" "$ANNEE

else

echo "29 jours en "$NOM" "$ANNEE

fi

fi

fi;;

esac

[6
2]
Exercice 2 :

Créer un script shell réalisant la création d'un répertoire "Exo3" contenant 10 fichiers
nommés "Un" à "Dix". Chaque fichier contient une seule ligne:

 "Un" contient "Première ligne"


 "Deux" contient "Deuxième ligne"
 ...
 "Dix" contient "Dixième ligne"

Vérifier que le répertoire à créer n'existe pas déjà auquel cas il ne sera pas recréé mais les
fichiers si.

Correction

test -e Exo3
Initiation à la programmation Shell Version 2015
if [ $? != 0 ]

then

mkdir Exo3

fi

echo "Premiere ligne" >Exo3/Un

echo "Deuxieme ligne" >Exo3/Deux

echo "Troisieme ligne" >Exo3/Trois

echo "Quatrieme ligne" >Exo3/Quatre

echo "Cinquieme ligne" >Exo3/Cinq

echo "Sixieme ligne" >Exo3/Six

echo "Septieme ligne" >Exo3/Sept

echo "Huitieme ligne" >Exo3/Huit

echo "Neuvieme ligne" >Exo3/Neuf

[6
3]
echo "Dixieme ligne" >Exo3/Dix

Exercice 3 :

Créer un script nommé "table" permettant d'afficher des tables de multiplication.


"table 5 10" aura pour résultat l'affichage:

0x5=0
1x5=5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
6 x 5 = 30
7 x 5 = 35
8 x 5 = 40
9 x 5 = 45
10 x 5 = 50

Correction
Initiation à la programmation Shell Version 2015

for V in $(seq 0 $2)

do

echo $V" x "$1" = "$(expr $V "*" $1 )

done

[6
4]