Agence web » Actualités du digital » Comment utiliser le cas .. Instructions esac dans Bash –

Comment utiliser le cas .. Instructions esac dans Bash –

une-breve-histoire-d39unix-cloudsavvy-it-7337062

Dans ce didacticiel, nous examinons les instructions conditionnelles basées sur des cas Bash. Nous passons en revue des exemples pratiques et discutons du moment où une instruction Bash est préférable d’utiliser une instruction esac plutôt qu’une instruction plus traditionnelle if .. then .. fi déclaration.

Cas Bash .. Déclarations esac dans Bash

Disponible en mode natif depuis le shell Bash, instructions conditionnelles case, formulées à l’aide du case et esac idiomes (un idiome est un mot ou un groupe de mots, ou un mot-clé, avec des modèles d’utilisation établis; une forme d’expression d’un langage informatique), on peut construire un conditionnel complexe au cas par cas (d’où le terme case) recherche et instruction d’exécution par cas.

La partie de recherche d’une instruction basée sur un cas est parfois appelée sélectionner, conduisant au terme instruction select / case (ou l’inverse), utilisé dans certains autres langages de codage comme VBA, pour désigner le même type de paradigme de programmation. Un autre ensemble de langages (comme C #, C ++, Java et JavaScript) appelle cela un commutateur ou interrupteur / boîtier déclaration. Tous ces éléments ont des significations et des opérations similaires.

Construisons notre premier case .. esac déclaration à l’aide d’un simple script.

Un simple cas .. esac scénario

Nous définissons notre script de test test.sh comme suit:

#!/bin/bash

case "${1}" in 
  1) echo "Option was 1!";;
  2) echo "Option was 2!";;
  *) echo "Option was something else: '${1}'";;
esac

Ensuite, nous rendons notre script exécutable en exécutant chmod +x test.sh puis nous exécutons le script lui-même, en passant à chaque fois une option différente en entrée.

Dans notre cas de clause d’ouverture, nous spécifions que nous voulons utiliser la première option d’entrée ($1) comme variable à évaluer. Notre case .. esac vérifiera chaque option (comme indiqué par le texte précédant un ) clause closing idiom), puis traitez le bloc de code (après le ) idiome) pour le résultat correct.

Notez qu’il y a deux ; terminateurs de fin d’instruction à la fin de chaque ligne. La raison en est simple; la syntaxe Bash normale nécessite que vous ayez au moins un idiome de fin ; (sauf si vous êtes déjà à la fin d’une ligne), mais à l’intérieur du case .. esac déclaration, nous avons besoin d’un ; pour indiquer que nous terminons un bloc de code pour un bloc d’exécution de code de cas spécifique.

Nous pouvons voir comment nous avons défini le code pour les deux cas où 1 et 2 sont passés au script, respectivement. Cependant, que se passe-t-il lorsque nous passons autre chose? Dans ce cas, nous voulons passer à notre autre clause, indiquée par un universel * idiome.

Un cas simple .. instruction esac dans Bash

On voit comment on passe 1 ou 2 au script, l’action correcte correspondante est effectuée; Option was 1/2!. Nous voyons aussi comment si nous faisons autre chose, le * Le bloc de code est exécuté correctement et notre première variable passée au script est également affichée. Que se passerait-il si nous ne passions aucune option à notre script? La case .. esac le code serait toujours évalué, et puisque rien ne correspond à l’exception de notre fourre-tout * clause, celle-ci est exécutée:

Ne pas transmettre de variable à notre script de test fonctionne également grâce à la clause * dans notre cas .. instruction esac

Alors que se passerait-il si nous devions supposer, quelque chose qui peut sembler logique, que nous pouvons laisser un seul ; déclaration de la fin de la ligne de chaque case .. esac clause simplement parce qu’en même temps une EOL (fin de ligne) est atteinte?

Fin de bloc de code incorrecte dans un cas Bash ... instruction esac

Notez qu’une seule terminaison ; a été utilisé dans ce script. Bash ne le permet pas et une erreur est produite; la syntaxe finale finale de ;; est nécessaire, et quelque chose à garder à l’esprit lors de l’écriture case .. esac déclarations

Pourquoi cas .. esac Et pas si?

Nous pourrions également écrire le code précédent en utilisant un if déclaration:

#!/bin/bash

if [ "${1}" == "1" ]; then
  echo "Option was 1!"
elif [ "${1}" == "2" ]; then
  echo "Option was 2!"
else
  echo "Option was something else: '${1}'";
fi

Une alternative à une instruction case..esac utilisant une instruction if..then..elif..else..fi

Cela semble comparable en qualité de code et en brièveté par rapport à notre case .. esac code, et dans les situations données et des cas d’utilisation spécifiques comme ceux-ci, if .. then .. elif .. else .. fi solution basée fera très bien l’affaire.

Cela dit, si et quand la complexité de la sélection devient plus complexe ou plus grande, ou s’il y a des sélections de cas multicouches à effectuer (notez que case .. esac peut être imbriqué), il peut être avantageux d’utiliser case .. esac déclarations à la place.

Une autre fonctionnalité intéressante de case .. esac est que l’on peut lister deux options possibles pour un seul bloc d’exécution de code, comme nous le verrons dans notre prochain exemple, mais cela peut également être fait avec le standard Bash if instructions, en utilisant par exemple le -a (et et -o (ou) des options de notre clause de test et en spécifiant une clause de test secondaire. Par exemple, if [ "${1}" -eq 1 -o "${1}" -eq 3 ]; then ... Notez qu’ici, nous avons également utilisé des comparaisons numériques au lieu de comparaisons basées sur du texte comme dans notre exemple ci-dessus.

Pour plus d’informations sur if .. then .. else .. elif .. fi conditionnelles, vous pouvez également lire notre article Test conditionnel dans Bash: if, then, else, elif.

Élargir notre cas

Développons notre script précédent et rendons nos conditions un peu plus complexes:

#!/bin/bash

case "${1}" in 
  1|3) echo "Option was 1!"
       echo "Or, option was 3!";;
  2|'a') case "${1}" in 
           2) echo "Option was 2!";;
         'a') echo "Option was 'a'!";;
         esac;;
  *) echo "Option was something else: '${1}'";;
esac

Un cas plus complexe .. instruction esac dans Bash avec des sélecteurs supplémentaires

Dans ce cas, nous avons répertorié deux options possibles pour chaque bloc de code et les avons séparées par un | séparateur. Notez comment tout fonctionne bien et les entrées 1 et 3 sont correctement analysés. Dans le deuxième bloc de code, nous avons créé un cas imbriqué et utilisé chaque entrée possible dans le deuxième bloc de code (à savoir 2 et a) en tant que nouvelles options dans l’esac imbriqué / secondaire.

Cela fonctionne à nouveau parfaitement. Le flux à travers le code est celui du premier case déclaration, le 2|'a' la branche est prise est 2 ou a est passé, puis le second case garantit que soit 2 ou a est sélectionné individuellement. Il est également intéressant d’utiliser ;; chaque fois que nous voulons terminer un bloc de code pour une option spécifique, et cela s’applique également à la fin de la case .. esac, encore avec ;;, c’est à dire esac;;.

Emballer

Dans ce didacticiel, nous avons examiné des exemples pratiques de case .. esac déclarations. Nous avons également vu où les déclarations de cas sont un meilleur choix que plus traditionnel if .. then .. fi déclarations fondées.

Si Bash vous intéresse, vous pouvez trouver Primer: Bash Loops: for, while et Until, Bash Process Termination Hacks et How to Correctly Parse File Names in Bash to be of interest.

Prendre plaisir!

★★★★★