Les scripts bash
6_Les structures conditionnelles
généralités
Une structure conditionnelle est une structure dans laquelle on effectue un test. Le script se comportera de façon différente en fonction du résultat du test. On peut aussi réaliser des boucles tant que le test est vrai.
Les tests peuvent porter sur des fichiers (et/ou répertoires), sur des entiers et sur des chaines de caractères. Leur syntaxe n'est pas la même dans tous les cas. On peut aussi faire des combinaisons de tests.
Il existe deux façons de faire les tests : soit entre crochets, soit avec la commande 'test'.
SI [ tests ] ALORS ...
SI test tests ALORS ...
Attention à ne pas oublier l'espace après le premier crochet, et avant le dernier !
Tests sur les fichiers/répertoires
Voici une liste des tests possibles sur les fichiers et/ou répertoires :
- "-e fichier" : vrai si le fichier/répertoire existe.
- "-s fichier" : vrai si le fichier à une taille supérieure à 0.
- "-r fichier" : vrai si le fichier/répertoire est accessible en lecture.
- "-w fichier" : vrai si le fichier/répertoire est accessible en écriture.
- "-x fichier" : vrai si le fichier est exécutable ou si le répertoire est accessible.
- "-O fichier" : vrai si le fichier/répertoire appartient à l'utilisateur.
- "-G fichier" : vrai si le fichier/répertoire appartient au groupe de l'utilisateur.
- "-b nom" : vrai si nom représente un périphérique (pseudo-fichier) de type bloc (disques et partitions de disques généralement).
- "-c nom" : vrai si nom représente un périphérique (pseudo-fichier) de type caractère (terminaux, modems et port parallèles par exemple).
- "-d nom" : vrai si nom représente un répertoire.
- "-f nom" : vrai si nom représente un fichier.
- "-L nom" : vrai si nom représente un lien symbolique.
- "-p nom" : vrai si nom représente un tube nommé.
- "fichier1 -nt fichier2" : vrai si les deux fichiers existent et si fichier1 est plus récent que fichier2.
- "fichier1 -ot fichier2" : vrai si les deux fichiers existent et si fichier1 est plus ancien que fichier2.
- "fichier1 -ef fichier2" : vrai si les deux fichiers représentent un seul et même fichier.
Tests sur les entiers
- "entier1 -eq entier2" : vrai si entier1 est égal à entier2.
- "entier1 -ge entier2" : vrai si entier1 est supérieur ou égal à entier2.
- "entier1 -gt entier2" : vrai si entier1 est strictement supérieur à entier2.
- "entier1 -le entier2" : vrai si entier1 est inférieur ou égal à entier2.
- "entier1 -lt entier2" : vrai si entier1 est strictement inférieur à entier2.
- "entier1 -ne entier2" : vrai si entier1 est différent de entier2.
Tests sur les chaines de caractères
Les chaines doivent être entourées par des guillemets.
- "-n "chaîne"" : vrai si la chaîne n'est pas vide.
- "-z "chaîne"" : vrai si la chaîne est vide.
- ""chaine1" = "chaine2"" : vrai si les deux chaînes sont identiques.
- ""chaine1" != "chaine2"" : vrai si les deux chaînes sont différentes.
Les combinaisons de tests
Les combinaisons de tests sont utilisées quand on doit faire plusieurs tests simultanément, c'est à dire, quand on doit répondre à plusieurs conditions.
On utilise les opérateurs && et || comme dans les commandes composées. L'opérateur ! sert à inverser la condition.
- SI test ALORS commandes FIN : exécute les commandes si test est VRAI
- SI ! test ALORS commandes FIN : exécute les commandes si test est FAUX
- SI test1 && test2 ALORS commandes FIN : exécute les commandes si test1 ET test2 sont vrais tous les deux
- SI test1 -a test2 ALORS commandes FIN : pareil de précédement, avec une autre notation
- SI test1 && ! test2 ALORS commandes FIN : exécute les commandes si test1 est VRAI ET test2 est FAUX
- SI test1 || test2 ALORS commandes FIN : exécute les commandes si test1 OU test2 sont VRAIS
- SI test1 -o test2 ALORS commandes FIN : pareil de précédement, avec une autre notation
- SI ! { test1 || test2 } ALORS commandes FIN : exécute les commandes si NI test1 NI test2 sont VRAIS
structure SI ... ALORS
La syntaxe de cette structure est :
if test; then action-1 action-2 ... action-n; fi
Il faut bien mettre un point-virgule après le test et aprè la dernière action. On termine la structure avec la commande fi.
structure SI ... ALORS ... SINON
La syntaxe est :
if test; then action1; else action2; fi
Si le test est vrai, on exécute l'action1 (ou le groupe d'actions1), sinon, on exécute l'action2 (ou le groupe d'actions2). Bien mettre le point virgule après le test et chaque commande ou groupe de commandes.
structure SI ... ALORS ... SINON SI ... ALORS ... SINON
syntaxe :
if test1; then action1; elif test2; then action2; else action3; fi
Si test1 est vrai, on exécute l'action1, sinon, si test2 est vrai, on exécute l'action2, sinon, on exécute l'action3. Bien mettre le point virgule après chaque test et chaque commande ou groupe de commandes.
On peut avoir autant de 'elif' qu'on veut. Voyons un exemple d'utilisation de cette structure :
#!/bin/bash
echo -n "Entrez un nombre entier : " ; read nombre
if [ $nombre -lt 0 ]; then
echo "$nombre est negatif";
elif [ $nombre -gt 0 ]; then
echo "$nombre est positif";
else
echo "$nombre est egal a zero";
fi
Et voilà le résultat :
$ ./test.sh
Entrez un nombre entier : 12
12 est positif
$ ./test.sh
Entrez un nombre entier : -5
-5 est negatif
$ ./test.sh
Entrez un nombre entier : 0
0 est egal a zero
structure TANT QUE ... FAIRE
Il existe deux commandes pour faire ça : while et until. While va répéter la boucle tant que le test est vrai. Until va répéter la boucle jusqu'à ce que le test soit vrai.
La syntaxe des deux commandes est :
while test; do action1 action2; done
until test; do action1 action2; done
Comme avec les structures précédentes, on met un point-virgule après le test et après le groupe d'actions.
Il arrive très souvant, en programmation, qu'on veuille répéter une opération un certain nombre de fois. Dans ce cas, on utilise un entier qui va nous servir de compteur. Pour incrémenter ce compteur, on utilise la commande let suivie de l'opération à effectuer, selon la syntaxe suivante :
let $[ commande ]
Voici un exemple très simple, qui affiche les nombres de 1 à 10.
#!/bin/bash
i=1 # on initialise le compteur
while [ $i -le 10 ]; do
echo $i
let $[ i+=1 ] # incremente i de 1 a chaque boucle
done
Et on obtient :
./test.sh
1
2
3
4
5
6
7
8
9
10
L'instruction "i+=1" sert à incrémenter i de 1. C'est une syntaxe employée dans de nombreux langage, mais qui n'est peut-être pas claire pour le débutant. On peut la remplacer par "i=$i+1", ce qui nous donne "let $[ i=$i+1 ]". Celle-ci est plus facilement compréhensible.
<< page précédente
5_Le passage de paramètres |
page suivante >>
7_Les autres structures |