Comment utiliser les instructions de cas dans les scripts Bash

0
251
Patpitchaya/Shutterstock.com

Bash case les déclarations sont puissantes mais faciles à écrire. Lorsque vous revisitez un ancien script Linux, vous serez heureux d'avoir utilisé une instruction case au lieu d'une longue instruction if-then-else.

L'instruction case< /h2>

La plupart des langages de programmation ont leur version d'une instruction switch ou case. Ceux-ci dirigent le flux d'exécution du programme en fonction de la valeur d'une variable. En règle générale, il existe une branche d'exécution définie pour chacune des valeurs possibles attendues de la variable et une branche fourre-tout ou par défaut pour toutes les autres valeurs.

La fonctionnalité logique est similaire à une longue séquence d'instructions if-then avec une instruction else captant tout ce qui n'a pas été précédemment géré par l'une des instructions if.

RELATEDQu'est-ce que le shell Bash et pourquoi est-il si important pour Linux ?

L'implémentation Bash de case essaie de faire correspondre une expression avec l'une des clauses. Il le fait en examinant chaque clause, à tour de rôle, en essayant de trouver un modèle correspondant. Les modèles dans les clauses sont des chaînes, mais de manière contre-intuitive, cela ne signifie pas que nous ne pouvons pas utiliser des valeurs numériques comme expression.

Le cas générique

La forme générique de l'instruction case est la suivante :

expression case dans   pattern-1)   instruction        ;; pattern-2)   déclaration   ;; . . . pattern-N)   instruction   ;; *) déclaration ;; esac

  • Une instruction case doit commencer par le mot-clé case et se terminer par le mot-clé esac.
  • L'expression est évaluée et comparée aux modèles de chaque clause jusqu'à ce qu'une correspondance soit trouvée.
  • L'instruction ou les instructions de la clause correspondante sont exécutées.
  • Un double point-virgule “;;” est utilisé pour terminer une clause.
  • Si un motif correspond et que les instructions de cette clause sont exécutées, tous les autres motifs sont ignorés.
  • Il n'y a pas de limite au nombre de clauses.
  • Un astérisque “*” désigne le modèle par défaut. Si une expression ne correspond à aucun des autres modèles de l'instruction case, la clause par défaut est exécutée.

Un exemple simple

Ce script nous indique les heures d'ouverture d'un magasin imaginaire. Il utilise la commande date avec la chaîne de format +”%a” pour obtenir le nom du jour abrégé. Ceci est stocké dans la variable DayName.

#!/bin/bash DayName=$(date +”%a”) echo “Heures d'ouverture pour $DayName” case $DayName in Mon) echo “09:00 – 17:30” ;; mar) echo “09:00 – 17:30” ;; Mer) echo “09:00 – 12:30” ;; jeu) echo “09:00 – 17:30” ;; Ven) echo “09:00 – 16:00” ;; Sam) echo “09:30 – 16:00” ;; Soleil) echo “Fermé toute la journée” ;; *) ;; esac Advertisement

Copiez ce texte dans un éditeur et enregistrez-le dans un fichier appelé “open.sh.”

Nous devrons utiliser le chmod commande pour le rendre exécutable. Vous devrez le faire pour tous les scripts que vous créez pendant que vous travaillez sur cet article.

chmod +x open.sh

Nous pouvons maintenant exécuter notre script.

./open.sh

Le jour où la capture d'écran a été prise est un vendredi. Cela signifie que la variable DayName contient la chaîne “Fri.” Cela correspond au “Ven” modèle du “Ven)” clause.

Notez que les motifs dans les clauses n'ont pas besoin d'être entourés de guillemets doubles, mais cela ne fait aucun mal s'ils le sont. Cependant, vous devez utiliser des guillemets doubles si le motif contient des espaces.

La clause par défaut a été laissée vide. Tout ce qui ne correspond pas à l'une des clauses précédentes est ignoré.

Ce script fonctionne et il est facile à lire, mais il est long et répétitif. Nous pouvons raccourcir ce type de déclaration de cas assez facilement.

CONNEXES : Comment utiliser la commande chmod sous Linux

Utiliser plusieurs modèles dans une clause

Une caractéristique vraiment intéressante des instructions case est que vous pouvez utiliser plusieurs modèles dans chaque clause. Si l'expression correspond à l'un de ces modèles, les instructions de cette clause sont exécutées.

Publicité

Voici un script qui vous indique combien de jours il y a dans un mois. Il ne peut y avoir que trois réponses : 30 jours, 31 jours ou 28 ou 29 jours pour février. Ainsi, bien qu'il y ait 12 mois, nous n'avons besoin que de trois clauses.

Dans ce script, l'utilisateur est invité à saisir le nom d'un mois. Pour rendre la correspondance de motif insensible à la casse, nous utilisons la commande shopt avec l'option -s nocasematch. Peu importe que l'entrée contienne des majuscules, des minuscules ou un mélange des deux.

#!/bin/bash shopt -s nocasematch echo “Entrez le nom d'un mois” read month case $month in février) echo “28/29 jours en $month” ;; avril | juin | septembre | novembre) echo “30 jours dans $month” ;; janvier | mars | mai | juillet | août | octobre | décembre) echo “31 jours dans $month” ;; *) echo “Mois inconnu : $mois” ;; esac

Février a une clause à lui tout seul, et tous les autres mois partagent deux clauses selon qu'ils ont 30 ou 31 jours. Les clauses multi-modèles utilisent le symbole pipe “|” comme séparateur. La casse par défaut capture les mois mal orthographiés.

Nous l'avons enregistré dans un fichier appelé “month.sh”, et l'avons rendu exécutable.

chmod +x month.sh

Nous exécuterons le script plusieurs fois et montrerons que peu importe que nous utilisions des majuscules ou des minuscules.

./month.sh

Publicité

Parce que nous avons dit au script d'ignorer les différences entre les majuscules et les minuscules, tout nom de mois correctement orthographié est géré par l'une des trois clauses principales. Les mois mal orthographiés sont pris en compte par la clause par défaut.

Utilisation de chiffres dans les déclarations case

Nous pouvons également utiliser des chiffres ou des variables numériques comme expression. Ce script demande à l'utilisateur d'entrer un nombre dans la plage 1..3. Pour indiquer clairement que les modèles de chaque clause sont des chaînes, ils ont été entourés de guillemets doubles. Malgré cela, le script fait toujours correspondre l'entrée de l'utilisateur à la clause appropriée.

#!/bin/bash echo “Enter 1, 2, or 3: ” read Number case $Number in “1”) echo “Clause 1 correspond” ;; “2”) echo “Clause 2 correspond” ;; “3”) echo “Clause 3 correspond” ;; *) echo “Clause par défaut correspond” ;; esac

Enregistrez ceci dans un fichier appelé “number.sh”, rendez-le exécutable, puis exécutez-le :

./number.sh

Utilisation des instructions case dans les boucles for

Une instruction case essaie de faire correspondre un motif à une seule expression. Si vous avez beaucoup d'expressions à traiter, vous pouvez mettre l'instruction case dans une boucle for.

Ce script exécute la commande ls pour obtenir une liste de fichiers. Dans la boucle for, la globalisation des fichiers—similaire mais différente des expressions régulières—est appliquée à chaque fichier à tour de rôle pour extraire l'extension de fichier. Ceci est stocké dans la variable de chaîne d'extension.

Publicité

L'instruction case utilise la variable Extension comme expression qu'elle essaie de faire correspondre à une clause.

#!/bin/bash for File in $(ls) do # extraire l'extension de fichier Extension=${File# #*.} case “$Extension” dans sh) echo ” Script Shell : $File” ;; md) echo ” Markdown file: $File” ;; png) echo “Fichier image PNG : $Fichier” ;; *) echo “Inconnu : $Fichier” ;; esac done

Enregistrez ce texte dans un fichier appelé “filetype.sh”, rendez-le exécutable, puis exécutez-le en utilisant :

./filetype.sh

Notre script d'identification de type de fichier minimaliste fonctionne.

CONNEXES : < strong>Comment utiliser “Here Documents” dans Bash sur Linux

Gestion des codes de sortie avec des instructions case

< p>Un programme bien élevé enverra un code de sortie au shell lorsqu'il se terminera. Le schéma conventionnel utilise une valeur de code de sortie de zéro pour indiquer une exécution sans problème, et des valeurs d'un ou plusieurs pour indiquer différents types d'erreur.

De nombreux programmes n'utilisent que zéro et un. Le regroupement de toutes les conditions d'erreur dans un seul code de sortie rend l'identification des problèmes plus difficile, mais c'est une pratique courante.

CONNEXESComment travailler avec des variables dans Bash

Nous avons créé un petit programme appelé “go-geek” qui renverrait au hasard des codes de sortie de zéro ou un. Ce script suivant appelle go-geek. Il acquiert le code de sortie en utilisant le $? shell et l'utilise comme expression pour l'instruction case.

Un script du monde réel effectuerait un traitement approprié en fonction du succès ou de l'échec de la commande qui a généré le code de sortie.

#! /bin/bash cas de go-geek $? in “0”) echo “La réponse était : Succès” echo “Faire le traitement approprié ici” ;; “1”) echo “La réponse était : Erreur” echo “Gérer les erreurs de manière appropriée ici” ;; *) echo “Réponse non reconnue : $?” ;; esac

Enregistrez-le dans un script appelé “return-code.sh” et le rendre exécutable. Vous devrez remplacer notre commande go-geek par une autre commande. Vous pouvez essayer de cd dans un répertoire qui n'existe pas pour obtenir un code de sortie de un, puis éditer votre script sur cd dans un répertoire accessible pour obtenir un code de sortie de zéro.

Publicité

L'exécution du script plusieurs fois montre que les différents codes de sortie sont correctement identifiés par l'instruction case.

./return-code.sh

La lisibilité facilite la maintenance

Revenir aux anciens scripts Bash et travailler comment ils font ce qu'ils font, surtout s'ils ont été écrits par quelqu'un d'autre, est un défi. Modifier la fonctionnalité des anciens scripts est encore plus difficile.

L'instruction case vous donne une logique de branchement avec une syntaxe claire et facile. C'est & #8217;gagnant-gagnant.

CONNEXION : Comment installer et utiliser Linux Bash Shell sur Windows 10

LIRE LA SUITE

  • › Message d'intérêt public : les escrocs utilisent la pénurie de puces pour tromper les gens
  • › Arrêtez de fermer les applications sur votre téléphone Android
  • › Acheter un Mac ou MacBook d'occasion ? Vérifiez ces éléments avant d'acheter
  • › Qu'est-ce que la protection contre les chutes MIL-SPEC ?
  • › 5 astuces psychologiques dans les jeux gratuits (et comment les éviter)
  • › Windows 11 contre Chrome OS : quelle est la meilleure solution pour les applications Android ?