Comment utiliser le cas .. Instructions esac dans Bash –
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.
Sommaire
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.
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:
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?
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
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
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!