GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Scripting - Déclaration de cas

Dans l'article précédent, nous avons vu comment travailler avec des instructions conditionnelles dans bash pour évaluer les conditions et prendre des décisions en fonction des résultats. De même, dans cet article, nous apprendrons à utiliser case statement dans les scripts Bash, qui est également utilisé pour évaluer les conditions. Vous pouvez utiliser une instruction Bash case au lieu d'écrire une longue liste de if..elif..else déclaration. Si vous n'avez aucune idée des instructions conditionnelles, nous avons un article détaillé sur le sujet. Je vous conseille d'y jeter un œil avant de lire cet article.

  • Scripts bash – Instructions conditionnelles

Syntaxe de l'instruction case

La syntaxe de l'instruction case dans bash est donnée ci-dessous :

expression
case expression in
  pattern1) STATEMENTS ;;
  pattern2) STATEMENTS ;;
  Pattern3 | Pattern4 | pattern5) STATEMENTS ;;
  pattern-N) STATEMENTS ;;
  *) STATEMENTS ;;
esac

Explication :

  1. Le mot-clé "case" et "esac" marque le début et la fin de l'instruction case.
  2. La casse du mot clé doit être suivie d'une "expression" . Cette expression sera évaluée et la sortie sera recherchée dans la liste des modèles.
  3. Après l'expression, le "in" le mot-clé doit être écrit, ce qui pointe vers "value in patterns" .
  4. Vous pouvez créer autant de motifs que vous le souhaitez. Vous pouvez considérer chaque motif comme un if et elif clause dans l'instruction conditionnelle. Si la valeur évaluée à partir de l'expression correspond à un modèle, ce modèle exécutera son bloc de code. Les motifs restants seront ignorés.
  5. Chaque instruction à l'intérieur du modèle doit se terminer par un double point-virgule (;; ).
  6. Semblable à la clause else dans l'instruction if, dans l'instruction case il existe un modèle par défaut appelé astérisques (* ) qui exécutera son bloc de code si aucun des modèles ne correspond.

Exemple 1 - Calculatrice utilisant l'instruction case

Dans cet exemple, j'ai créé une calculatrice simple à l'aide d'une instruction case. Laissez-moi vous expliquer ce qui se passe lorsque vous exécutez ce code.

  1. L'utilisateur est invité à entrer deux chiffres et il est stocké dans les variables "X" et "Y" .
  2. L'utilisateur est invité à saisir le type d'opération (addition, soustraction, multiplication, division) et stocké dans la variable "OPERATOR" .
  3. Dans l'instruction case, la variable "OPERATOR" est évalué et différents modèles (+ ,- ,x ,/ ,% ) sont créés pour différentes opérations.
  4. Si un modèle correspond, le modèle particulier exécutera son instruction en sautant tous les autres modèles dans l'instruction case.
  5. Si vous essayez d'entrer d'autres valeurs que les opérateurs arithmétiques souhaités, le modèle par défaut (* ) exécutera son instruction.
#!/usr/bin/env bash

read -p "Enter the first number(X)  :  " X
read -p "Enter the second number(Y) :  " Y
read -p "
Addition => +
Subtract => -
Multiply => x
Division => /
Reminder => %

Choose any one operator   :  " OPERATOR
case "$OPERATOR" in
 +)
   echo -e "\nAddition of X and Y is $(( X + Y ))" ;;
 -)
   echo -e "\nSubtraction of X and Y is $(( X - Y ))" ;;
 x)
   echo -e "\nMultiply X and Y is $(( X * Y ))" ;;
 /)
   echo -e "\nDivision of X and Y is $(( X / Y ))" ;;
 %)
   echo -e "\nReminder of X and Y is $(( X % Y ))" ;;
 *)
   echo -e "\n[ERROR] You have chosen an operator that is not in the list.
You can choose either(+, -, x, /, %) operator from the list.
Rerun the program again."
esac

Jetez un œil à l'image ci-dessous, je soumets le code et je choisis l'« opérateur d'ajout » .

J'exécute à nouveau le même code mais cette fois en donnant une valeur aléatoire qui fera le modèle par défaut (* ) exécute son instruction.

Exemple 2 - Création de plusieurs modèles dans une seule clause

Dans l'exemple précédent, nous avons créé différents modèles pour différents opérateurs arithmétiques. Il est également possible de créer plusieurs modèles dans la même clause et si l'un des modèles correspond, l'instruction particulière s'exécutera. La syntaxe sera la même mais vous ajouterez un pipe symbole (| ) et ajoutez différents motifs dans la même ligne comme ci-dessous.

expression
case expression in
   Pattern1 | Pattern2 | pattern3) 
   STATEMENTS ;;
   *)
   STATEMENTS ;;
esac

Dans l'exemple ci-dessous, l'utilisateur saisira l'année en entrée et obtiendra les détails du plafond orange à partir des données IPL. Dans les années 2015, 2017 et 2019, le même joueur a remporté la casquette orange, j'ai donc créé une année différente comme modèle dans la même clause.

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Exemple 3 - Correspondance de modèle dans l'instruction case

Correspondance de modèle peut être utilisé dans les instructions case. J'utilise le même exemple de la section précédente mais en ajoutant un modèle supplémentaire (20[2-9][2-9]) où si l'utilisateur entre une année au-dessus de 2021, il imprimera un message indiquant "la série n'a pas encore eu lieu".

read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP
case "$CAP" in
 2015 | 2017 | 2019)
   echo -e "\nOrange cap winner for $YEAR is David Warner" ;;
 2016)
   echo -e "\nOrange cap winner for $YEAR is Virat Kohli" ;;
 2018)
  echo -e "\nOrange cap winner for $YEAR is Kane Williamson" ;;
 2020)
   echo -e "\nOrange cap winner for $YEAR is KL Rahul" ;;
 2021)
   echo -e "\nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;;
 20[2-9][2-9])
   echo -e "\nSeries is yet to happen for the year $CAP" ;;
 *)
   echo -e "\n[ERROR] Enter the year between 2015 - 2021."
esac

Exemple 4 - Obtenir la confirmation de l'utilisateur

Parfois, vous pouvez demander à l'utilisateur de fournir une confirmation pour passer à l'étape suivante de votre programme. L'utilisation d'une instruction case serait un bon choix pour ce cas d'utilisation.

Dans l'exemple précédent, le modèle est écrit sur une ligne et les instructions sur une autre ligne, mais vous pouvez également écrire des modèles et des instructions sur une seule ligne, comme indiqué ci-dessous.

read -p "Input file is received in CSV format, Please confirm to load the data into production database  : " CONFIRM
case "$CONFIRM" in
 [Yy] | [Yy][Ee][Ss] ) echo "++ Running the utility to load the data to the database.." ;;
 [Nn] | [Nn][Oo] ) echo -e "++ Skipping load db step upon user confirmation..\n Exiting the script.." ;;
 *) echo -e "[ERROR] = Wrong Input, Exiting the script.."
esac

Exemple 5 - Instruction de cas avec codes de retour

Vous pouvez écrire une logique pour capturer le code de retour de la commande précédemment exécutée et effectuer certaines actions à l'aide d'instructions case. Je crée une boîte de dialogue GUI pour accepter le nom d'utilisateur et le mot de passe de l'utilisateur utilisant zenity . Si l'utilisateur soumet le nom d'utilisateur et le mot de passe avec succès, zenity renverra le code de retour à zéro et sur cette base, j'ai ajouté une logique pour ajouter un nouvel utilisateur. Tout autre que zéro, un message d'erreur sera émis.

INFO=$(zenity --password --username)
case $? in
 0)
   USERNAME=$(echo ${INFO} | awk -F "|" '{ print $1 }')
   PASSWORD=$(echo ${INFO} | awk -F "|" '{ print $2 }')
   useradd -m -p "${PASSWORD}" "${USERNAME}"
   ;;
 *)
   echo "[ERROR] - User not added."
esac

J'ai appuyé sur "Annuler" bouton dans la boîte de dialogue, il m'a donc renvoyé une erreur en utilisant le modèle par défaut (* ).

Suggestion de lecture :

  • Comment créer des boîtes de dialogue GUI dans des scripts Bash avec Zenity sous Linux et Unix

Scripts de référence

Pour vous familiariser avec les instructions de cas, vous pouvez consulter les codes existants écrits à l'aide d'instructions de cas. Un meilleur endroit pour commencer serait de lire les scripts de démarrage sous /etc/init.d annuaire. Par exemple, j'ai installé virtualbox sur ma machine et il a un fichier de démarrage sous /etc/init.d annuaire. Il y a une section de code écrite à l'aide d'une instruction case qui donnera une bonne idée du fonctionnement de l'instruction case.

$ cd /etc/init.d/
$ cat bluetooth

Conclusion

Dans cet article, nous avons vu ce qu'est l'instruction case dans Bash et les différentes façons de l'utiliser. L'instruction conditionnelle et l'instruction case ont le même objectif. Vous devriez avoir une meilleure compréhension de la méthode qui correspond au cas d'utilisation. Les instructions de cas seront également utilisées lorsque vous devrez créer des fonctions d'aide à l'aide de getopt et getopts programmes. Créez un script et commencez à pratiquer les exemples que nous avons donnés ici pour mieux comprendre les déclarations de cas.

Guides de script bash :

  • Scripts bash – Instructions conditionnelles
  • Scripts bash – Manipulation de chaînes
  • Scripts bash – Explication de la commande Printf à l'aide d'exemples
  • Scripts bash – Tableau indexé expliqué à l'aide d'exemples
  • Scripts bash - Tableau associatif expliqué avec des exemples
  • Scripts bash – Explication de la boucle For avec des exemples
  • Scripts bash :boucle While et Until expliquée à l'aide d'exemples
  • La redirection bash expliquée avec des exemples
  • Scripts bash – Variables expliquées à l'aide d'exemples
  • Scripts bash – Fonctions expliquées à l'aide d'exemples
  • La commande Bash Echo expliquée avec des exemples sous Linux
  • Tutoriel Bash Heredoc pour les débutants

Linux
  1. Script bash (I)

  2. Mécanisme des blocs d'instructions dans les scripts Shell ?

  3. Utilisation des déclarations de cas dans Bash

  4. Instruction Bash If-Else avec des exemples

  5. 5 exemples d'instructions Bash Case

Script Bash - Instructions conditionnelles

Script Bash - Manipulation de chaînes

Comment travailler avec l'instruction Case dans les scripts Bash

Script bash (II)

Script bash (III)

Syntaxe Bash If Else avec exemples