GNU/Linux >> Tutoriels Linux >  >> Linux

Shell Scripting Partie 3 :Structures de contrôle de décision dans les scripts Shell

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 :


case in
<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


Linux
  1. Tableaux associatifs dans les scripts shell ?

  2. Verrouiller correctement les scripts Shell ?

  3. Extensions de fichiers pour les scripts shell Unix ?

  4. Trier une partie d'un fichier ?

  5. Comment supprimer une chaîne d'un fichier via des scripts shell ?

Shell Scripting pour les débutants - Comment écrire des scripts Bash sous Linux

Comment vérifier si un fichier ou un répertoire existe dans Bash Shell

Shell Scripting Part4 - Entrée, sortie et redirection

Tutoriel étape par étape sur les scripts shell

Tableaux dans les scripts shell

Qu'est-ce qu'un fichier .sh ?