Lors de l'écriture de scripts Bash, il est courant de vérifier une chaîne par rapport à une variable, puis de faire quelque chose en fonction de ce qui a été spécifié.
Considérez le script suivant. Il vérifie le premier argument spécifié par un utilisateur et fait différentes choses en fonction de ce qui a été donné :
#!/usr/bin/env bash
if [[ "${1}" == "" ]]; then
echo "No shape was specified."
elif [[ "${1}" == "square" ]]; then
echo "You specified 'square'."
elif [[ "${1}" == "circle" ]]; then
echo "You specified 'circle'."
elif [[ "${1}" == "triangle" ]]; then
"You specified 'triangle'."
else
echo "Unknown shape '${1}'."
exit 1
fi
Cela illustre, bien que sans fonctionnalité, une tâche simple qui peut répéter une forme connue à un utilisateur, ou si la forme est inconnue, afficher un message d'erreur.
Tout va bien et dandy là-dedans, et tout fonctionne comme prévu. Mais regardez combien de lignes cela a pris. Voyez comment vous devez gérer chaque option qu'un utilisateur passe à travers un elif
déclaration ?
Maintenant, l'imagerie de ce programme a encore plus d'options, disons 20. Avec l'approche actuelle, vous allez écrire un if
instruction avec 20 elif
sections à l'intérieur.
Oui, vous pourrez probablement le lire pour la plupart. Mais c'est maladroit, prend trop de place, et surtout, il existe une meilleure alternative.
Présentation de l'instruction case dans Bash
C'est là qu'interviennent les instructions de cas. Celles-ci peuvent réduire le nombre de lignes de code dont vous avez besoin pour vérifier les choses de loin par rapport à if
déclarations.
Le même if
l'instruction que vous avez utilisée pour vérifier les options fournies pourrait être réécrite comme ceci à l'intérieur d'un cas :
#!/usr/bin/env bash
case "${1}" in
"") echo "No option was specified."; exit 1 ;;
square) echo "You specified 'square'." ;;
circle) echo "You specified 'circle'." ;;
triangle) echo "You specified 'triangle'." ;;
*) echo "Unknown shape '${1}'."; exit 1 ;;
esac
Regardez à quel point cela semble plus simple et organisé. C'est 12 lignes de code dans le if
déclaration, et seulement 7 dans le case
une. Et plus vous autorisez d'options, plus la différence devient drastique.
Et c'est là que case
les déclarations brillent. Bien que les deux soient complètement lisibles, surtout en petite quantité, case
les déclarations rendent simplement tout plus propre et plus maintenable à long terme.
Comment créer une instruction case dans Bash ?
Les déclarations de cas sont assez simples à comprendre avec juste un peu de pratique. Sur ce, voici les bases de ce qui se passe :
La première ligne que vous avez vue était case ${1} in
. Le ${1}
donne la chaîne qui sera vérifiée, ici étant le premier argument passé au script.
Par exemple, considérez cette déclaration de cas :
case linux in
windows) echo "windows" ;;
macos) echo "macos" ;;
linux) echo "linux" ;;
esac
Dans cet exemple, il exécutera toujours echo "linux"
. Le case *string* in
part spécifie simplement la chaîne que vous allez vérifier, puis les options en dessous exécuteront les commandes chaque fois qu'une correspondance est trouvée.
Ensuite, vous commencez à spécifier vos options. Rappelez-vous, vous aviez ""
, square
, circle
, triangle
, et *
comme options dans votre premier script.
Les instructions de cas sont vérifiées de haut en bas et ne s'exécutent que sur la première correspondance. Prenons l'exemple suivant :
case linux in
linux) echo "linux" ;;
windows) echo "windows" ;;
linux) echo "linux 2.0" ;;
esac
Ici, la seule commande qui s'exécuterait serait echo "linux"
. La deuxième correspondance serait alors ignorée, car une correspondance avait déjà été trouvée.
Chaque ligne d'une instruction case doit également se terminer par ;;
. Cela signifie la fin de la liste des commandes pour une option et qu'aucune autre commande ne doit être traitée.
La liste des arguments dans une instruction case (le linux)
et windows)
les pièces prennent également en charge les caractères génériques. Ainsi, en entrant quelque chose comme linu*)
correspondrait à la fois à linux
et linus
.
Enfin, vous terminez l'instruction case avec esac
. Cela lui permet de savoir que vous avez listé tout ce que vous voudriez qu'il traite, comme done
ferait dans un for
ou while
boucle.
esac
est case
en arrière. Énoncés de cas en pratique - vérifications d'arguments
Une utilisation fréquente des instructions de cas dans ma propre programmation est la vérification par rapport à une liste d'arguments.
Supposons que vous autorisez les options suivantes à être fournies à votre programme :
--vertical
--add-txt
--replace
--verify
Pour vérifier cela dans une instruction case, vous pouvez utiliser quelque chose comme ceci :
while [[ "${1}" != "" ]]; do
case "${1}" in
--vertical) verticle="true" ;;
--add-txt) add_txt="true" ;;
--replace) replace="true" ;;
--verify) verify="true" ;;
esac
shift 1
done
Cela exécute un while
boucle while ${1}
(le premier argument donné à un script) n'est pas vide. Il vérifie ensuite par rapport à une liste d'arguments et affecte des variables lorsque l'option fournie est définie.
Après vérification par rapport à l'instruction case, il exécute ensuite shift 1
, provoquant la valeur de ${2}
(le deuxième argument fourni à un script) pour passer à la valeur de ${1}
, et le répète par rapport au nouveau ${1}
(qui était auparavant ${2}
) jusqu'à ${1}
n'est défini sur rien.
Et voilà ! Voilà toutes les bases de l'utilisation des instructions de cas.
Conclusion
Les instructions case peuvent vous aider à écrire du code à la fois plus rapidement et plus efficacement. Ils contribuent également à rendre les choses plus lisibles et maintenables à long terme.
Si vous êtes nouveau sur Bash, vous pouvez apprendre les bases de Bash à partir de zéro dans notre série Bash pour débutants.
Vous avez des questions ou quelque chose ne fonctionne pas correctement ? N'hésitez pas à laisser un commentaire ci-dessous, et je ferai de mon mieux pour vous répondre !