Structures conditionnelles IF et CASE dans shell
Jusqu'à présent, tous les scripts shell présentés traitent les commandes de manière linéaire - une commande après l'autre. Cependant, toute programmation n'est pas linéaire. Il arrive que vous souhaitiez que votre programme teste certaines conditions, comme l'existence d'un fichier ou la valeur 0 d'une expression mathématique, et exécute différentes commandes en fonction des résultats du test. Pour cela, le shell Bash fournit des structures logiques.
Les structures logiques nous permettent de tester une ou plusieurs conditions spécifiques, puis de passer à différentes sections de code selon que la condition donne lieu à une valeur de sortie nulle (vraie) ou non nulle (fausse). Il existe plusieurs façons d'implémenter les structures logiques dans les scripts Bash.
La structure if-then
La structure logique la plus élémentaire est la structure conditionnelle if-then. Le format de la structure conditionnelle if-then est le suivant :
if [ condition ] then commandes fi
Si la condition que vous spécifiez est évaluée à une valeur de sortie nulle (vraie), le shell exécute les commandes dans la section then du code. Si la condition est évaluée à une valeur de sortie différente de zéro (fausse), le script shell ignore les commandes dans la section then du code.
La syntaxe de la condition if-then est généralement délicate pour ceux qui débutent dans l'écriture de scripts shell. Il est essentiel de s'assurer qu'un espace est inclus après le premier crochet et avant la condition, ainsi qu'après la condition et avant l dernier crochet : [ condition ].
L'expression de condition a plusieurs formats différents dans la programmation du shell Bash. Il existe des tests intégrés pour les valeurs numériques, les valeurs de chaîne de caractères et même les fichiers et répertoires.
Test | Type de données | Description |
---|---|---|
n1 -eq n2 | Valeurs numériques | Vérifie si n1 est égal à n2 |
n1 -ge n2 | Valeurs numériques | Vérifie si n1 est supérieur ou égal à n2 |
n1 -gt n2 | Valeurs numériques | Vérifie si n1 est supérieur à n2 |
n1 -le n2 | Valeurs numériques | Vérifie si n1 est inférieur ou égal à n2 |
n1 -lt n2 | Valeurs numériques | Vérifie si n1 est inférieur à n2 |
n1 -ne n2 | Valeurs numériques | Vérifie si n1 n'est pas égal à n2 |
str1 = str2 | Chaîne de caractères | Vérifie si str1 est identique à str2 |
str1 != str2 | Chaîne de caractères | Vérifie si str1 n'est pas la même que str2 |
str1 < str2 | Chaîne de caractères | Vérifie si str1 est inférieure à str2 |
str1 > str2 | Chaîne de caractères | Vérifie si str1 est supérieure à str2 |
n str1 | Chaîne de caractères | Vérifie si str1 a une longueur supérieure à zéro |
-z str1 | Chaîne de caractères | Vérifie si str1 a une longueur de zéro |
-d fichier | Fichiers | Vérifie si le fichier existe et est un répertoire |
-e fichier | Fichiers | Vérifie si le fichier existe |
-f fichier | Fichiers | Vérifie si le fichier existe et est un fichier |
-r fichier | Fichiers | Vérifie si le fichier existe et est lisible |
-s fichier | Fichiers | Vérifie si le fichier existe et n'est pas vide |
-w fichier | Fichiers | Vérifie si le fichier existe et est accessible en écriture |
-x fichier | Fichiers | Vérifie si le fichier existe et est exécutable |
-O fichier | Fichiers | Vérifie si le fichier existe et appartient à l'utilisateur actuel |
-G fichier | Fichiers | Vérifie si le fichier existe et que le groupe par défaut est le même que l'utilisateur actuel |
fichier1 -nt fichier2 | Fichiers | Vérifie si fichier1 est plus récent que fichier2 |
fichier1 -ot fichier2 | Fichiers | Vérifie si fichier1 est plus ancien que fichier2 |
Voici un exemple d'utilisation de plusieurs structures conditionnelles if-then dans un script shell :
#!/bin/bash a='' b=5 c=17 if [ -z $a ] then echo "La variable est vide" fi # if [ $b -eq $c ] then echo "les valeurs sont égales" fi # if [ $c -gt $b ] then echo "b est supérieure à c" fi # if [ $b -lt $c ] then echo "b est inférieure c" fi exit
devinfo@ubuntu:~/scripts$ structure.sh La variable est vide b est supérieure à c b est inférieure c
Tests composes
Vous pouvez réduire le nombre d'instructions if-then en utilisant la logique booléenne pour combiner les tests. Ces opérateurs sont les suivants :
[ conditionA ] && [ conditionB ] [ conditionA ] || [ conditionB ]
Le premier opérateur effectue un test "et", où les deux conditions doivent retourner un état de sortie nul (vrai). Le deuxième opérateur effectue un test "ou". Dans ce cas, une seule condition doit renvoyer un état de sortie nul.
Structure conditionnelle if-then-else
Dans la structure if-then, vous n'avez qu'une seule option pour savoir si une commande réussit. Si la commande renvoie une valeur de sortie différente de zéro (faux), le shell Bash passe simplement à la commande suivante du script. Dans cette situation, il serait bien de pouvoir exécuter un autre ensemble de commandes. C'est exactement à cela que sert la structure if then-else.
La structure if-then-else fournit un autre groupe de commandes :
if [ condition ] then commandsA else commandsB fi
Lorsque la commande de la ligne d'instruction if renvoie une valeur de sortie nulle, les commandes répertoriées dans la section then sont exécutées, comme dans une instruction if-then normale. Lorsque la commande de la ligne d'instruction if renvoie une valeur de sortie différente de zéro, le shell Bash exécute les commandes de la section else.
#!/bin/bash if [ $1 -eq $2 ] then echo "Les deux valeurs sont égales" else echo "Les deux valeur sont différentes" fi
devinfo@ubuntu:~/scripts$ structure.sh 15 15 Les deux valeurs sont égales devinfo@ubuntu:~/scripts$ structure.sh 3 17 Les deux valeur sont différentes
Structure conditionnelle if-then-elif-else
Syntaxe
if [ conditionA ] then Commandes elif [ conditionB ] then Commandes ... else Commandes fi
Exemple
#!/bin/bash if [ $1 -eq $2 ] then echo "Les deux valeurs sont égales" elif [ $1 -gt $2 ] then echo "première valeur est la plus grande" else echo "deuxième valeur est la plus grande" fi exit
devinfo@ubuntu:~/scripts$ structure.sh 3 17 deuxième valeur est la plus grande devinfo@ubuntu:~/scripts$ structure.sh 3 2 première valeur est la plus grande devinfo@ubuntu:~/scripts$ structure.sh 3 3 Les deux valeurs sont égales
Structure case
Souvent, vous vous retrouverez à essayer d'évaluer la valeur d'une variable, en recherchant une valeur spécifique parmi un ensemble de valeurs possibles, comme nous l'avons montré dans les scripts précédents. Au lieu d'écrire plusieurs instructions if-then pour tester toutes les conditions possibles, vous pouvez utiliser une structure case.
L'instruction case vous permet de vérifier plusieurs valeurs d'une même variable dans un format orienté liste :
case variable in motif1) commandes1;; motif2 | motif3) commandes2;; motif4) commandes3;; *) commandes par défaut;; esac
La structure case compare la variable spécifiée aux différents motifs. Si la variable correspond au motif, le shell exécute la ou les commandes spécifiées pour le motif. Vous pouvez énumérez plus d'un motif sur une ligne, en utilisant l'opérateur barre pour séparer chaque motif en tant qu'opérateur « ou ». Le symbole astérisque (*) est utilisé pour capturer toutes les valeurs qui ne correspondent à aucun des motifs répertoriés.
#!/bin/bash case $1 in /home) echo "répertoire /home";; /bin | /sbin) echo "répertoire binaire";; /tmp) echo "répertoire temporaire";; *) echo "Autre répertoire";; esac exit
devinfo@ubuntu:~/scripts$ case.sh /bin répertoire binaire devinfo@ubuntu:~/scripts$ case.sh /sbin répertoire binaire devinfo@ubuntu:~/scripts$ case.sh /home répertoire /home devinfo@ubuntu:~/scripts$ case.sh /tmp répertoire temporaire devinfo@ubuntu:~/scripts$ case.sh /etc Autre répertoire
La structure case permet de spécifier de manière beaucoup plus claire les différentes options pour chaque valeur de variable possible.