Chapitre 1 : Introduction à la programmation Shell
I) Notions générales
Le shell est ce qui s’exécute quand vous vous connectez. C’est lui qui présente le prompt, qui
envoie vos commandes au système, qui enregistre certaines variables. Il est encore là quand
vous vous déconnectez. L’interpréteur de commandes, ou interprète, permet d’exécuter des
instructions que vous saisissez au clavier ou au sein d’un script et vous en retourne les résultats.
Cet interpréteur est un programme appelé shell. C’est à rapprocher du mot kernel (noyau) qui
est souvent entouré d’une coquille dure (pensez à un noyau d’abricot ou de pêche). Shell
signifie coquille, c’est donc ce qui « entoure » le noyau Linux : le moyen de l’utiliser à
l’aide de commandes. C’est donc une interface fonctionnant en mode texte entre le
noyau Linux et les utilisateurs (avancés).
Il existe plusieurs shells, chacun disposant de spécificités propres. Le Bourne Shell (sh) est le
shell le plus connu et le plus courant sur les Unix. Le C¬Shell (csh) reprend la structure du
langage C. Le Korn Shell (ksh) est une évolution du Bourne Shell. Le Z¬Shell (zsh) est
lui¬même une évolution du Korn Shell. Le shell de référence sous Linux se nomme le Bourne
Again Shell (bash). Voici une liste non exhaustive d’interpréteurs de commandes que vous
pouvez rencontrer sous Linux : sh : Thompson Shell (n’existe plus) ; sh : Bourne Shell (a
remplacé le précédent) ; bash : Bourne Again Shell ; ksh : Korn Shell ; csh : C Shell ; zsh :
Z Shell ; tcsh : Tenex C Shell ; ash : A Shell ; dash : Debian Almquist Shell. Un shell est
la liaison la plus élémentaire entre l'utilisateur et le système d'exploitation, c'est à dire le
programme de gestion de la ligne de commande. Les commandes saisies sont interprétées par
le shell et transmises au système d'exploitation.
II) Ecriture de script
Dans le monde de Linux, il est possible d’écrire plusieurs commandes à l’intérieur d’un script.
Mais, cela va plus loin car le Shell de Linux offre vraiment un environnement digne de tous les
langages de programmation. L’interpréteur de commande que nous utiliserons pour créer un
script est le #!/bin/bash
Dans la programmation Shell, l’écriture se fait par l’intermédiaire de la commande echo et la
lecture par l’intermédiaire de la commande read. L’option –e permet à Linux d’interpréter les
séquences présentes dans l’utilisation de echo.
1
Exemple : echo –e « Bonjour\n » permet d’afficher le mot Bonjour puis d’aller à la ligne.
read n permet de lire le contenu de la variable n
Il est à remarquer que dans la programmation Shell, il n’est pas nécessaire de déclarer les
variables qu’on utilise. Voici un exemple de script complet depuis sa création.
vim [Link]
#!/bin/bash
echo –e « Ceci est un exemple de script. Entrez une valeur : »
read n
echo –e « Voici la valeur de n : $n »
echo –e « Voici le contenu du dossier Documents : »
ls /home/avo/Documents/
Ce script permet d’afficher la phrase « Ceci est un exemple de script. Entrez une valeur : » puis
de lire la valeur de la variable. Si l’utilisateur avait tapé 2, on aurait la phrase : « Voici la valeur
de n : 2 ». Puis « Voici le contenu du dossier Documents » et le contenu du dossier Documents
serait affiché.
Pour lancer le programme, on doit d’abord rendre le fichier exécutable en utilisant :
chmod +x [Link] (à voir en détail dans le prochain chapitre)
Puis, on exécute le fichier en utilisant : ./[Link]
III) Les variables
Elles peuvent être réparties en 3 classes : utilisateur, système et spéciales. Le principe est de
pouvoir affecter un contenu à un nom de variable, généralement une chaîne de caractère ou des
valeurs numériques. Un nom de variable obéit à certaines règles : Il peut être composé de lettres
minuscules, majuscules, de chiffres, de caractères de soulignement. Le premier caractère ne
peut pas être un chiffre. Le taille d’un nom est en principe illimitée (il ne faut pas abuser non
plus). Les conventions veulent que les variables utilisateur soient en minuscules pour les
différencier des variables système (choix de l’utilisateur).
2
1. Variable utilisateur
Une variable est déclarée dès qu’une valeur lui est affectée. L’affectation est effectuée avec le
signe =, sans espace avant ou après le signe.
var=Bonjour
Pour afficher la liste des variables on utilise la commande env. Elle affiche les variables
utilisateurs et les variables systèmes, nom et contenu.
Vous supprimez une variable avec la commande unset. Vous protégez une variable en
écriture et contre sa suppression avec la commande readonly. Une variable en lecture
seule, même vide, est figée. Il n’existe aucun moyen de la replacer en écriture et de la
supprimer, sauf en quittant le shell.
3
Par défaut une variable n’est accessible que depuis le shell où elle a été définie. La
variable a est déclarée sous l’invite du shell courant puis est affichée par un script lancé
depuis ce même shell. Ce dernier ne connaît pas la variable a : rien ne s’affiche.
La commande export permet d’exporter une variable de manière à ce que son contenu soit
visible par les scripts et autres sousshells. Les variables exportées peuvent être modifiées
dans le script, mais ces modifications ne s’appliquent qu’au script ou au sousshell. Cette
fois le premier script peut accéder à la variable a exportée. Mais les modifications restent locales
au script. Une fois celuici terminé la modification disparaît.
Les accolades de base {} permettent d’identifier le nom d’une variable. Imaginez la variable
fichier contenant le nom de fichier ’liste’. Vous voulez copier liste en liste2.
$ fichier=liste
$ cp $fichier $fichier2
cp: opérande fichier manquant
Pour en savoir davantage, faites: « cp --help ». Cela ne fonctionne pas car ce n’est pas $fichier
qui est interprété mais $fichier et $fichier2 qui n’existent pas.
$ cp ${fichier} ${fichier}2
Dans ce cas, cette ligne équivaut à :
$ cp liste liste 2
Les accolades disposent d’une syntaxe particulière.
{variable:Remplacement}
Selon la valeur ou la présence de la variable, il est possible de remplacer sa valeur par une autre.
4
2. Variables systèmes
En plus des variables que l’utilisateur peut définir luimême, le shell est lancé avec un
certain nombre de variables prédéfinies utiles pour certaines commandes et accessibles
par l’utilisateur. Le contenu de ces variables système peut être modifié mais il faut alors
faire attention car certaines ont une incidence directe sur le comportement du système.
5
3. Variables spéciales
Il s’agit de variables accessibles uniquement en lecture et dont le contenu est généralement
contextuel.
IV) Essentiels
1. Longueur d’une chaîne
Il est possible d’obtenir la longueur d’une chaîne avec le caractère #.
$ a=Jules
6
$ echo "Longueur de $a : ${#a}"
Longueur de Jules : 5
2. Tableaux et champs
Deux moyens sont disponibles pour déclarer un tableau, l’un avec l’utilisation des crochets.
[ ], l’autre avec la création globale. Le premier élément est 0 le dernier 1023. Pour accéder au
contenu du tableau il faut mettre la variable ET l’élément entre accolades {}.
$ Nom[0]="Jules"
$ Nom[1]="Romain"
$ Nom[2]="Francois"
$ echo ${Nom[1]}
Romain
ou :
$ Nom=(Jules Romain Francois)
$ echo ${nom[2]}
Francois
Pour lister tous les éléments :
$ echo ${Nom[*]}
Jules Romain Francois
Pour connaître le nombre d’éléments :
$ echo ${#Nom[*]}
Si l’index est une variable, on ne met pas le $ devant celuici :
$ idx=0
$ echo ${Nom[idx]}
Jules
7
3. Variables typées
Les variables peuvent être typées en entier (integer) avec la commande typeset i le
permet. L’avantage est qu’il devient possible d’effectuer des calculs et des comparaisons
sans passer par expr. La commande let ou ((...)) permet des calculs sur variables.
8
Chapitre 2 : Notions de conditions et arguments d’un script
Les conditions vues dans les autres types de programmation sont également valables dans la
programmation Shell. Il est à noter que les espaces sont très importantes dans la programmation
Shell.
I) Conditions
Les syntaxes utilisées sont : if then, elif then, else et fi, case in et esac pour les conditions.
1. Exemple pour if
if [ condition1 ]
then
instruction1
elif [ condition2 ]
then
instruction2
else
instruction3
fi
2. Exemple pour case
case $n in
condition1)
instruction1
;;
condition2)
instruction2
;;
*)
instruction3
9
;;
Esac
3. Paramètres pour if
Voici les paramètres à tenir en compte pour l’utilisation de if.
Utilisation de chaines
Condition Signification
$chaine1 = $chaine2 Vérifie si les deux chaînes sont identiques. Notez que bash est
sensible à la casse : « b » est donc différent de « B ».
Il est aussi possible d'écrire « == » pour les habitués du langage
C.
$chaine1 != $chaine2 Vérifie si les deux chaînes sont différentes.
-z $chaine Vérifie si la chaîne est vide.
-n $chaine Vérifie si la chaîne est non vide.
Utilisation de nombres
Condition Signification
$num1 - Vérifie si les nombres sont égaux (equal). À ne pas confondre avec le « = »
eq $num2
qui, lui, compare deux chaînes de caractères.
$num1 - Vérifie si les nombres sont différents (nonequal).
ne $num2
Encore une fois, ne confondez pas avec « != » qui est censé être utilisé sur
des chaînes de caractères.
$num1 - Vérifie si num1est inférieur ( < ) ànum2(lowerthan).
lt $num2
$num1 - Vérifie sinum1est inférieur ou égal ( <= ) ànum2(lowerorequal).
le $num2
$num1 - Vérifie sinum1est supérieur ( > ) ànum2(greaterthan).
gt $num2
$num1 - Vérifie sinum1est supérieur ou égal ( >= ) ànum2(greaterorequal).
ge $num2
10
Test de fichier
Condition Signification
-e $nomfichier Vérifie si le fichier existe.
-d $nomfichier Vérifie si le fichier est un répertoire. N'oubliez pas que sous Linux,
tout est considéré comme un fichier, même un répertoire !
-f $nomfichier Vérifie si le fichier est un… fichier. Un vrai fichier cette fois, pas un
dossier.
-L $nomfichier Vérifie si le fichier est un lien symbolique (raccourci).
-r $nomfichier Vérifie si le fichier est lisible (r).
-w $nomfichier Vérifie si le fichier est modifiable (w).
-x $nomfichier Vérifie si le fichier est exécutable (x).
$fichier1 - Vérifie sifichier1est plus récent que fichier2 (newerthan).
nt $fichier2
$fichier1 - Vérifie sifichier1est plus vieux que fichier2 (olderthan).
ot $fichier2
II) Arguments d’un script
1. Paramètres de position
Les paramètres de position sont aussi des variables spéciales utilisées lors d’un passage de
paramètres à un script.
11
2. Redéfinition des paramètres
Outre le fait de lister les variables, l’instruction set permet de redéfinir le contenu des variables
de position. Avec :
set valeur1 valeur2 valeur3 ...
$1 prendra comme contenu valeur1, $2 valeur2 et ainsi de suite.
3. Réorganisation des paramètres
La commande shift est la dernière commande permettant de modifier la structure des paramètres
de position. Un simple appel décale tous les paramètres d’une position en supprimant le premier
: $2 devient $1, $3 devient $2 et ainsi de suite. Le $1 originel disparaît. $#, $* et $@ sont
redéfinis en conséquence.
La commande shift suivie d’une valeur n effectue un décalage de n éléments. Ainsi avec shift
4 $5 devient $1, $6 devient $2, …
12
La commande exit permet de mettre fin à un script. Par défaut la valeur retournée est
0 (pas d’erreur) mais n’importe quelle autre valeur de 0 à 255 peut être précisée. Vous
récupérez la valeur de sortie par la variable $?.
$ exit 1
13