Nous utilisons des cookies pour améliorer votre expérience. En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies.


Politique de confidentialité

Structures conditionnelles IF et CASE dans shell

 

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.

TestType de donnéesDescription
n1 -eq n2Valeurs numériquesVérifie si n1 est égal à n2
n1 -ge n2Valeurs numériquesVérifie si n1 est supérieur ou égal à n2
n1 -gt n2Valeurs numériquesVérifie si n1 est supérieur à n2
n1 -le n2Valeurs numériquesVérifie si n1 est inférieur ou égal à n2
n1 -lt n2Valeurs numériquesVérifie si n1 est inférieur à n2
n1 -ne n2Valeurs numériquesVérifie si n1 n'est pas égal à n2
str1 = str2Chaîne de caractèresVérifie si str1 est identique à str2
str1 != str2Chaîne de caractèresVérifie si str1 n'est pas la même que str2
str1 < str2Chaîne de caractèresVérifie si str1 est inférieure à str2
str1 > str2Chaîne de caractèresVérifie si str1 est supérieure à str2
n str1Chaîne de caractèresVérifie si str1 a une longueur supérieure à zéro
-z str1Chaîne de caractèresVérifie si str1 a une longueur de zéro
-d fichierFichiersVérifie si le fichier existe et est un répertoire
-e fichierFichiersVérifie si le fichier existe
-f fichierFichiersVérifie si le fichier existe et est un fichier
-r fichierFichiersVérifie si le fichier existe et est lisible
-s fichierFichiersVérifie si le fichier existe et n'est pas vide
-w fichierFichiersVérifie si le fichier existe et est accessible en écriture
-x fichierFichiersVérifie si le fichier existe et est exécutable
-O fichierFichiersVérifie si le fichier existe et appartient à l'utilisateur actuel
-G fichierFichiersVérifie si le fichier existe et que le groupe par défaut est le même que l'utilisateur actuel
fichier1 -nt fichier2FichiersVérifie si fichier1 est plus récent que fichier2
fichier1 -ot fichier2FichiersVé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.

Partager ce cours avec tes amis :
Rédigé par ESSADDOUKI Mostafa
ESSADDOUKI
The education of the 21st century opens up opportunities to not merely teach, but to coach, mentor, nurture and inspire.