Salut! Nous avons déjà couvert les bases des scripts shell, telles que l'acceptation des entrées, le traitement des données via des opérations arithmétiques et la génération et l'affichage de la sortie dans les parties précédentes de ce didacticiel (partie 1 et partie 2). Dans cette partie, nous approfondirons un sujet plus avancé dans un langage de programmation - prendre des décisions dans un programme, mais cette fois nous le ferons en utilisant bash shell. Commençons !
Introduction
La plupart de nos langages de programmation actuels sont capables de prendre des décisions en fonction des conditions que nous fixons. Une condition est une expression qui donne une valeur booléenne - vrai ou faux. Tout programmeur peut rendre son programme intelligent en fonction de la décision et de la logique qu'il met dans son programme. Le shell bash prend en charge les déclarations de décision if et switch (case).
Instruction Si
Si est une déclaration qui permet au programmeur de prendre une décision dans le programme en fonction des conditions qu'il a spécifiées. Si la condition est remplie, le programme exécutera certaines lignes de code, sinon, le programme exécutera d'autres tâches spécifiées par le programmeur. Voici la syntaxe prise en charge de l'instruction if dans le shell bash.
Syntaxe générale
Décision unique :
if <condition>
then
### series of code goes here
fi
Double décision :
if <condition>
then
### series of code if the condition is satisfied
else
### series of code if the condition is not satisfied
fi
Multiple si condition :
if <condition1>
then
### series of code for condition1
elif <condition2>
then
### series of code for condition2
else
### series of code if the condition is not satisfied
fi
Syntaxe à crochet unique
if [ condition ]
then
### series of code goes here
fi
Syntaxe à double crochet
if ((condition))
then
### series of code goes here
fi
La syntaxe à crochet unique est la plus ancienne syntaxe prise en charge dans le shell bash. Il est utilisé avec toutes les instructions conditionnelles sous Linux. Pendant ce temps, la syntaxe à double parenthèse est utilisée pour une instruction conditionnelle basée sur un nombre afin de fournir une syntaxe familière aux programmeurs. Tous les types d'instructions if ont besoin d'une condition spécifiée pour exécuter une tâche.
Instructions conditionnelles sous Linux
Les instructions conditionnelles sont utilisées avec une instruction de contrôle de décision. Il existe différents types d'instructions conditionnelles que vous pouvez utiliser dans le shell bash, les plus courantes étant :les conditions basées sur des fichiers, des chaînes et des arithmétiques.
Condition basée sur un fichier
Les conditions basées sur les fichiers sont des expressions unaires et sont souvent utilisées pour examiner l'état d'un fichier. La liste suivante répertorie les conditions basées sur les fichiers les plus couramment utilisées dans le shell bash.
Opérateur | Description |
-un fichier | Renvoie vrai si le fichier existe |
-b fichier | Renvoie vrai si le fichier existe et est un fichier spécial bloc |
-c fichier | Renvoie vrai si le fichier existe et est un fichier spécial caractère |
-d fichier | Renvoie true si le fichier existe et est un répertoire |
-e fichier | Renvoie vrai si le fichier existe |
-r fichier | Renvoie true si le fichier existe et est lisible |
-s fichier | Renvoie vrai si le fichier existe et a une taille supérieure à zéro |
-s fichier | Renvoie vrai si le fichier existe et a une taille supérieure à zéro |
-w fichier | Renvoie vrai si le fichier existe et est accessible en écriture |
-x fichier | Renvoie true si le fichier existe et est exécutable |
-N fichier | Renvoie vrai si le fichier existe et a été modifié depuis sa dernière lecture |
Prendre une décision basée sur un dossier
Prenons un exemple qui illustrera comment construire une décision basée sur un fichier dans un script bash. Dans cet exemple, nous allons créer un script qui détermine si le fichier existe dans le répertoire d'accueil.
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "file exists!"
else
echo "file does not exist"
fi
Dans cet exemple, nous nous sommes assurés que le shell retournera au répertoire personnel quel que soit notre répertoire actif actuel à l'aide de la commande cd. De plus, la commande ls est utilisée pour afficher la liste des fichiers dans le répertoire afin que nous puissions vérifier que le fichier existe vraiment ou non. Comme vous pouvez le voir, le script affiche le texte "le fichier existe !" car sample.sh se trouve dans le répertoire personnel.
Note: The shell compiler is very strict in terms of syntax especially with spaces. There should be a space between if and the open bracket and in between brackets and the condition.
Améliorons maintenant notre script en rendant notre code plus dynamique en permettant à l'utilisateur de saisir un nom de script et de déterminer les autorisations du fichier donné.
#!/bin/bash
cd
ls -l
read -p "Enter a file name: " filename
if [ -e $filename ]
then
echo "file exists!"
if [ -r $filename ]
then
status="readable "
fi
if [ -w $filename ]
then
status=$status"writable "
fi
if [ -x $filename ]
then
status=$status"executable"
fi
echo "file permission: "$status
else
echo "file does not exist"
fi
Condition basée sur une chaîne
Prendre des décisions basées sur une entrée utilisateur de chaîne est également possible dans le shell bash. La condition basée sur une chaîne renvoie une expression binaire comme résultat signifiant, elle renvoie vrai si la condition spécifiée est satisfaite sinon, elle renvoie faux. Voici les opérateurs conditionnels basés sur des chaînes couramment utilisés :
Opérateur | Description |
== | Renvoie vrai si les chaînes sont égales |
!= | Renvoie vrai si les chaînes ne sont pas égales |
-n | Renvoie vrai si la chaîne à tester n'est pas nulle |
-z | Renvoie vrai si la chaîne à tester est nulle |
Créons un exemple de script à l'aide d'une instruction conditionnelle basée sur une chaîne. Le script permettra à l'utilisateur de saisir deux chaînes et d'évaluer si l'une des chaînes est nulle, les deux chaînes sont égales et non égales.
#!/bin/bash
read -p "First String: " str1
read -p "Second String: " str2
if [ -z "$str1" ]
then
echo "The 1st string is null"
elif [ -z "$str2" ]
then
echo "The 2nd string is null"
else
if [ $str1 == $str2 ]
then
echo "The strings are equal"
else
echo "The strings are not equal"
fi
fi
Condition basée sur l'arithmétique
Le shell fournit plusieurs façons de déclarer une condition basée sur l'arithmétique. La première consiste à utiliser des mnémoniques qui peuvent être utilisés avec la syntaxe à crochet unique à l'ancienne et l'autre utilise des symboles adaptés aux mathématiques qui peuvent être utilisés avec la double parenthèse
Vous trouverez ci-dessous la liste des mnémoniques disponibles pour les instructions conditionnelles basées sur l'arithmétique dans le shell :
Opérateur | Utilisation/Description |
-eq | Égal |
-ge | Supérieur ou égal |
-gt | Supérieur à |
-le | Inférieur ou égal |
-lt | Moins de |
-ne | Pas égal |
Créons un script qui accepte un entier de l'utilisateur et détermine si l'entier est un nombre nul, négatif, impair ou pair.
#!/bin/bash
read -p "Enter an integer: " int1
if [ $int1 -eq 0 ]
then
echo "Zero"
elif [ $int1 -lt 0 ]
then
echo "Negative"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Even"
else
echo "Odd"
fi
fi
Opérateur arithmétique pour la syntaxe à double parenthèse :
Opérateur | Utilisation/Description |
== | Égal |
>= | Supérieur ou égal |
> | Supérieur à |
<= | Inférieur ou égal |
< | Moins de |
!= | Pas égal |
Maintenant, reconstruisons notre script précédent et utilisons la syntaxe des doubles parenthèses :
#!/bin/bash
read -p "Enter an integer: " int1
if (( $int1 == 0 ))
then
echo "Zero"
elif (( $int1 < 0 ))
then
echo "Negative"
else
if (( $((int1%2)) == 0 ))
then
echo "Even"
else
echo "Odd"
fi
fi
Instruction de commutation
L'instruction switch est un autre type d'instruction conditionnelle dans les scripts shell. Il permet à un programmeur de comparer plusieurs valeurs à une variable d'une manière plus simple par rapport à l'instruction conditionnelle if. La syntaxe de l'instruction switch est :
casein
<pattern1>)
##series of code for pattern1
;;
<pattern2>)
##series of code for pattern2
;;
<patternN>)
##series of code for patternN
;;
*)
##default statements
esac
Le modèle est la valeur possible de la variable. Chaque motif est séparé par un double point-virgule qui sert d'instruction de rupture du motif. L'instruction switch est fermée par une instruction esac.
#!/bin/bash
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menu: \n[a] Addition\n[b]Subtraction\n[c]Multiplication\n[d]Division\n"
echo "======================"
read -p "Your choice: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Invalid input"
esac
echo "The result is: " $res
Conclusion
Le shell bash fournit de nombreux outils utiles aux programmeurs. Tout comme la plupart des langages de programmation actuels, il est également capable de prendre des décisions conditionnelles qui rendent les scripts shell plus interactifs et intelligents. Nous présenterons une structure de contrôle répétitive dans la prochaine série. 'A la prochaine.
Références
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
- https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
La leçon suivante : Structures de contrôle de la répétition