Vous êtes sur la page 1sur 34

Systèmes d’Exploitation LINUX

Hiba Ouni

Iset’Com Tunis

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 1 / 34


Outline

1 Les interpréteurs de commandes


Les Variables
Arithmétique en Bash

2 Les scripts Shell


Les paramètres d’un script
Script interactif

3 Structures de contrôle
Les Test
Structures conditionnelles
Les structures répétitives

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 2 / 34


Les interpréteurs de commandes

Outline

1 Les interpréteurs de commandes


Les Variables
Arithmétique en Bash

2 Les scripts Shell


Les paramètres d’un script
Script interactif

3 Structures de contrôle
Les Test
Structures conditionnelles
Les structures répétitives

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 3 / 34


Les interpréteurs de commandes

Les interpréteurs de commandes


L’interpréteur de commandes, le shell, a pour rôle de traduire les
commandes saisies par l’utilisateur afin que le système puisse les exécuter.
Un shell permet également d’exécuter des fichiers, appelés scripts,
contenant une suite de commandes plus ou moins complexes. Il existe un
certain nombre de shells que l’on peut séparer en deux familles :
La famille des Bourne shell :
sh : le plus ancien développé chez AT&T par Steven Bourne fin 1970,
ksh : le korn shell développé chez AT&T par David Korn en 1980,
bash : le bourne again shell développé par la Free Software Foundation
en 1989,
zsh : un des derniers nés (1990) de la famille.
La famille des Bourne shell :
csh : dont le langage de programmation est très proche du langage C,
tcsh : compatible avec le C-shell et beaucoup plus complet.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 4 / 34


Les interpréteurs de commandes

Les interpréteurs de commandes

Le shell n’est pas qu’un simple interpréteur de commandes, mais dispose


d’un véritable langage de programmation avec notamment une gestion des
variables, des tests et des boucles, des opérations sur variables, des
fonctions...
Toutes les instructions et commandes sont regroupées au sein d’un script.
Lors de sont exécution,chaque ligne sera lue une à une et exécutée. Une
ligne peut se composer de commandes, de commentaires ou être vide.
Plusieurs instructions par lignes sont possibles, séparées par le « ; » ou liées
conditionnellement par « && » ou « || ». Le « ; » est l’équivalent d’un
saut de ligne.
Exemple : ls -l ; ls ; date
wc resultat.txt ; pwd

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 5 / 34


Les interpréteurs de commandes

Les interpréteurs de commandes


Il est aussi possible de grouper les commandes. Quand on exécute les
commandes suivantes :
uname -a ; pwd ; ls -l >resultat.txt &
seule la dernière commande est exécutée en tâche de fond et seul son
résultat est redirigé dans le fichier resultat.txt. Une solution serait :
uname -a >resultat.txt & ; pwd »resultat.txt & ; ls -l »resultat.txt &
Une seconde possibilité est l’utilisation des accolades ....
uname -a ; pwd ; ls -l ; > resultat.txt &
Les caractères « && » et « || » permettent d’effectuer une exécution
conditionnelle.
commande1 && commande2
commande1 || commande2
La commande située après « && » sera exécutée uniquement si la
commande précédente a abouti. La commande située après « || » ne sera
exécutée que si la commande précédente a echoué.
Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 6 / 34
Les interpréteurs de commandes

Compléments sur les métacaractères

Certains caractères ont une signification particulière pour le Shell et sont


appelés métacaractères (nous étudierons la fonctionnalité de certains plus
loin), ce sont :

Rappelons que les métacaractères *, ?, [...] permettent de construire des


chaînes de caractères génériques, ainsi :
* désigne une chaîne de caractères quelconque ;
? désigne un caractère quelconque ;
[...] désigne les caractères entre crochets, définis par énumération ou par un
intervalle.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 7 / 34


Les interpréteurs de commandes

Compléments sur les métacaractères


D’autres permettent de modifier l’interprétation d’une commande :
; (le point virgule) sépare deux commandes sur une même ligne ;
’ (l’apostrophe) délimite une chaîne de caractères contenant des espaces (à
l’intérieur, tous les métacaractères perdent leur signification) ;
" (le guillemet) délimite une chaîne de caractères contenant des espaces (à
l’intérieur, tous les métacaractères perdent leur signification, à l’exception
des métacaractères ‘, \ et $) ;
‘ (l’accent grave) "capture" la sortie standard pour former un nouvel
argument ou une nouvelle commande (cette particularité est présentée plus
loin) ;
\ (l’anti-slash) annihile la signification du métacaractère qui suit ;
{ et } (les accolades) permettent de regrouper un ensemble de commandes
et de les exécuter dans le "Shell courant" ;
( et ) (les parenthèses) permettent de regrouper un ensemble de commandes
et de les exécuter dans un "Shell fils".
Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 8 / 34
Les interpréteurs de commandes

Compléments sur les métacaractères


Remarque : Pour qu’un métacaractère perde sa signification et soit
interprété autrement par le Shell, il suffit de placer le caractère \ devant.
D’une façon générale, lorsqu’un ou plusieurs métacaractères figurent dans
une chaîne de caractères, il est parfois préférable d’utiliser le « quotage ».
Le quotage est utilisé pour supprimer les fonctionnalités de certains
caractères spéciaux du Shell, dont les métacaractères.
Ainsi, Trois délimiteurs permettent (ou non) d’effectuer des opérations à
l’intérieur même des chaînes de caractères :
’chaîne’ (apostrophe, ou quote) indique que la chaîne est utilisée telle quelle,
sans aucune modification ;
"chaîne" (guillemet, ou double quote) est utilisée pour que modifier la
chaîne de caractères avant utilisation. En particulier, les noms de variables
précédés de $ sont remplacés par la valeur de ladite variable ;
‘chaîne‘ (apostrophe inversée, ou backquote) permet de considérer la chaîne
de caractères comme une commande à effectuer, pour ensuite utiliser son
résultat.
Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 9 / 34
Les interpréteurs de commandes Les Variables

Notion de variable
Une variable Shell est identifiée par un nom commençant nécessairement par une
lettre et peut être utilisée dans les commandes (au sens large). La référence au
contenu d’une variable est obtenue en faisant précéder son nom du caractère $.
Déclaration :

Exemple :

On utilise une variable, par exemple, pour mémoriser des noms fréquemment
utilisés :

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 10 / 34


Les interpréteurs de commandes Les Variables

Variables d’environnement prédéfinies


Les variables d’environnement sont des variables du shell. Elles sont définies
lorsque l’utilisateur se connecte, lorsqu’il crée un nouveau terminal, ou dès
lors qu’il y a exécution d’un processus shell.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 11 / 34


Les interpréteurs de commandes Arithmétique en Bash

Arithmétique en Bash
L’arithmétique en bash n’est que sur les nombres entiers. Il faut utiliser une
syntaxe spécifique pour effectuer des opérations arithmétiques en bash. En
effet, les chiffres sont traités par bash comme des caractères et, par
conséquent, les nombres sont traités comme des mots. Par exemple la ligne
de commande suivante :
echo 3+2
affiche 3+2 (et non 5).
Cela signifie que l’expression 3+2 est traitée comme une chaîne de
caractères. Pour forcer bash à traiter les nombres dans un contexte
arithmétique, on utilise la syntaxe

(( EXPRESSIONS ))

Cette syntaxe évalue les expressions EXPRESSIONS de façon arithmétique.


L’évaluation n’affiche pas le résultat. Pour effectuer une expansion de
l’évaluation on utilise : $(( EXPRESSIONS ))
Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 12 / 34
Les interpréteurs de commandes Arithmétique en Bash

Arithmétique en Bash

Exemple : La ligne de commande


echo $(( 3+2 ))
affiche 5 .
Dans l’exemple précédent nous avons utilisé l’opérateur de somme, + . Les
autres opérateurs utilisables dans le contexte arithmétique sont les mêmes
que ceux du langage C (la précédence entre opérateurs est aussi héritée du
C).
Voici une liste assez complète :
+, - pour somme et différence ;
*, /, % pour produit, division et reste de division ;
==, != pour égalité ou inégalité ;
++ pour incrémenter ;
** pour l’exponentiel.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 13 / 34


Les scripts Shell

Outline

1 Les interpréteurs de commandes


Les Variables
Arithmétique en Bash

2 Les scripts Shell


Les paramètres d’un script
Script interactif

3 Structures de contrôle
Les Test
Structures conditionnelles
Les structures répétitives

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 14 / 34


Les scripts Shell

Structure d’un script shell


Un script shell est un ensemble de commandes réunies dans un fichier exécutable.
Généralement, la première ligne du script a une syntaxe fixe qui définit
l’interpréteur shell utilisé pour l’exécution :
# !référence_absolue_shell
Exemple Un script dont la première ligne est :
# !/bin/bash
est exécutée avec l’interpréteur de commandes bash.
Pour que le script puisse être exécuté, il faut s’assurer que le droit d’exécution est
bien présent, et éventuellement changer les protections du fichier :
chmod +x nom_script
Il peut ensuite être exécuté comme une commande habituelle :
./nom_script
Soit faire appel explicitement à la commande bash qui exécute les commandes :
bash nom_script
Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 15 / 34
Les scripts Shell Les paramètres d’un script

Les paramètres d’un script

Nous pouvons aussi passer des arguments au script. Les arguments d’un
script ne sont que des mots qui suivent le nom du script dans la ligne de
commande. Par exemple, si script1 est un script bash dans notre répertoire
de travail, la commande
./script1 arg1 arg2 . . . argm
Les commandes à l’intérieur du script peuvent utiliser ces arguments. Elles
peuvent aussi utiliser les informations sur le script même. Cela se fait grâce
à certains paramètres spéciaux.
Le paramètre contenant le nom du script est 0. Utilisation : "$0".
Le paramètre contenant le k-ième argument est k. Utilisation : "$1"
(premier argument), "$2" (deuxième argument), etc.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 16 / 34


Les scripts Shell Les paramètres d’un script

Variables de substitution prédéfinies

Ces variables sont liées à l’exécution d’une commande, elles ne peuvent


être modifiées. Elles sont évaluées, c’est-à-dire qu’elles sont toujours
évoquées précédées du caractère $.
0 nom du script (pathname) ($0) ;
# nombre d’arguments passés dans une commande ($#) ;
* liste de tous les arguments passés dans une commande ($*) ;
@ liste de tous les arguments ($@) ;
? code retourné par la dernière commande exécutée($ ?) ;
$ numéro de processus de ce Shell ($$) ;
! numéro du dernier processus lancé en arrière plan ($ !) ;

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 17 / 34


Les scripts Shell Les paramètres d’un script

Les paramètres d’un script

Exemple : On considère le script suivant (appellé example) :


# !/bin/bash
echo Script "$0"
echo $# Arguments :
echo "$@"
echo Troisième argument :
echo "$3"
Si l’on tape bash exemple arg1 arg2 "mon nom" la sortie sera :
Script exemple
3 Arguments :
arg1 arg2 mon nom
Troisième argument :
mon nom

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 18 / 34


Les scripts Shell Script interactif

Script interactif : la commande read


Nous savons qu’un script peut communiquer avec l’utilisateur, par exemple
grâce à la commande echo. L’utilisateur aussi peut fournir des informations
à un script en cours d’exécution. À ce propos, nous introduisons la
commande read. Dans ce cours on utilise la commande read avec la
syntaxe suivante :

read [-option] var1 var2 ...var n

La ligne de commande précédente lit une ligne de l’entrée standard (ou une
autre entrée si l’on utilise les redirections), la sépare en mots et affecte le
premier mot à la variable var1, le deuxième mot à var2, etc. Une option
très utilisée de la commande read est -p, qui affiche un message avant de
commencer la lecture de la ligne. Ce message est fourni en argument à
l’option. La syntaxe sera dans ce cas :

read -p "message" var1 var2 ...var n

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 19 / 34


Structures de contrôle

Outline

1 Les interpréteurs de commandes


Les Variables
Arithmétique en Bash

2 Les scripts Shell


Les paramètres d’un script
Script interactif

3 Structures de contrôle
Les Test
Structures conditionnelles
Les structures répétitives

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 20 / 34


Structures de contrôle Les Test

Code de retour

$ ? = code retour de la dernière commande exécutée


Convention : 0 = commande terminée sans erreurs
Exemples
cp toto.txt tutu.txt
echo $ ? ⇒ affiche 0
cp
echo $ ? ⇒ affiche 1
Plusieurs valeurs positives différentes peuvent être utilisées pour
discriminer le type d’erreur (cf. manuel de chaque commande)
exit val termine un script avec val comme code de retour
Ce code sera visible via $ ? dans le shell appelant

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 21 / 34


Structures de contrôle Les Test

La commande test

test a pour code de retour 0 si et seulement si l’expression qui lui est


donnée en arguments est vraie

Syntaxe : test expression ou [ expression ]

Très utilisée en conjonction avec les structures conditionnelles et les


boucles while, surtout sous la seconde forme (compacte)

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 22 / 34


Structures de contrôle Les Test

Test sur les fichiers

Syntaxe : option fichier (attention aux espaces)

-e fichier . Contrôle si fichier existe.


-f fichier . Contrôle si fichier existe et s’il est un fichier ordinaire.
-d fichier . Contrôle si fichier existe et s’il est un répertoire.
-s fichier . Contrôle si fichier existe et s’il a une taille non nulle.
-r fichier . Contrôle si fichier existe et s’il peut être lu.
-h fichier . Contrôle si fichier est un lien symbolique.
-w fichier . Contrôle si fichier existe et s’il peut être écrit.
-x fichier . Contrôle si fichier existe et s’il peut être exécuté.
-O fichier . Contrôle si fichier appartient à l’utilisateur.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 23 / 34


Structures de contrôle Les Test

Test sur les entiers

Syntaxe : : n1 option n2 (attention aux espaces)

Exemple
code de retour nul si la variable x représente un entier strictement inférieur
à 12
[ $x -lt 12 ]

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 24 / 34


Structures de contrôle Les Test

Test sur les chaînes de caractères

Syntaxe : chaîne 1 option chaîne 2 ou option chaîne (attention aux espaces)


chaîne 1 = chaîne 2 . Contrôle si les chaînes sont les mêmes.
chaîne 1 != chaîne 2 . Contrôle si les chaînes sont différentes.
chaîne 1 > chaîne 2 . Contrôle si chaîne 1 est supérieure à chaîne 2.
-z chaîne Contrôle si chaîne est vide
-n chaîne . Contrôle si chaîne n’est pas vide.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 25 / 34


Structures de contrôle Les Test

Opérateurs booléens sur les expressions

! EXPR => interprétation logique : NON


(Inverse le résultat de EXPR).

EXPR1 && EXPR2 => interprétation logique : ET

EXPR1 || EXPR2 => interprétation logique : OU

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 26 / 34


Structures de contrôle Les Test

Exemple :

Le script suivant afficherait à l’écran le message « Fichier présent » si


le fichier existe.
if [ -f fichier ]
then
echo "Fichier présent"
fi

Le code ci-dessous permet de vérifier si /home/Rep est un répertoire.


if [ -d /home/Rep ]
then
echo "Répertoire présent"
fi

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 27 / 34


Structures de contrôle Les Test

Exemple :

Le code ci-dessous test la variable $var est égale à 5 ; Si c’est le cas,


alors le message « Variable égale à 5 » est affiché à l’écran.
if [ $var -eq 5 ]
then
echo "Variable égale à 5"
fi

On peut vérifier si le paramètre existe avec-z (vérifie si la chaîne est


vide).
if [ -z $1 ]
then
echo "Pas de paramètre"
else
echo "Paramètre présent"
fi

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 28 / 34


Structures de contrôle Structures conditionnelles

Structures conditionnelles

La structure if-then-elif-else permet de contrôler des conditions. La syntaxe


générale est la suivante :
if COMMANDES_1
then
SUITE-DE-COMMANDES_1
elif COMMANDES_2
then
SUITE-DE-COMMANDES_2
...
elif COMMANDES_(m-1)
then
SUITE-DE-COMMANDES_(m-1)
else
SUITE-DE-COMMANDES_m
fi
Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 29 / 34
Structures de contrôle Structures conditionnelles

Structures conditionnelles

On peut regrouper les EXPRESSIONs par des parenthèses pour changer


l’ordre d’évaluation. D’autres valeurs pour EXPRESSION se trouvent dans
man test. Nous introduisons la structure case-esac. La syntaxe générale est
la suivante :
case EXPR in
EXPR1) COMMANDES1 ; ;
EXPR2) COMMANDES2 ; ;
...
*) COMMANDES ; ;
esac
Dans ce contexte, EXPR, EXPR1, etc peuvent contenir des paramètres,
des métacaractères, etc. Ils peuvent aussi être des listes d’expressions,
séparées par |.

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 30 / 34


Structures de contrôle Les structures répétitives

Les structures répétitives

Nous introduisons les structures les plus communes pour exécuter des
boucles (répétitions de tâches). La structure while-do exécute des
commandes jusqu’à ce qu’une condition soit satisfaite. La syntaxe générale
est la suivante :

while COMMANDE
do
COMMANDES
done

Les commandes COMMANDES sont exécutées tant que la commande


COMMANDE sort avec succès (code=0).

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 31 / 34


Structures de contrôle Les structures répétitives

Les structures répétitives


La structure for-do repète des tâches un nombre préalablement choisi de
fois. La syntaxe générale est la suivante :
for VARIABLE in MOTS
do
COMMANDES
done
Dans cette écriture, MOTS est une liste de mots. Pour les listes de mots
nous pouvons utiliser des expressions simples, comme 1 2 3 4 5, ou des
expressions plus compliquées, comme 1..5 (qui est équivalente à la
précédente) ou des expressions contenant des métacaractères. En effet
cette structure fait d’abord l’expansion des mots contenus dans la liste
MOTS et après pour chacun de ces mots :
1 affecte la valeur de la variable VARIABLE au mot courant (en suivant

l’ordre de la liste)
2 exécute COMMANDES

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 32 / 34


Structures de contrôle Les structures répétitives

Les structures répétitives

Exemple : La structure suivante


for i in *.mp3
do
rm "$i"
done
supprime tous les fichier se terminant par ".mp3" dans le répertoire de
travail (où l’on lance le script par exemple).

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 33 / 34


Structures de contrôle Les structures répétitives

Les structures répétitives

Exemple :
Le script suivant calcule la somme des nombres entiers passés en argument.

a=0
for i in $@
do
(( a += $i ))
done
echo $a

Hiba Ouni (Iset’Com Tunis) Systèmes d’Exploitation LINUX 34 / 34

Vous aimerez peut-être aussi