Dans de nombreuses langues, il est possible d'affecter le résultat d'une instruction case / switch à une variable, plutôt que de répéter l'affectation de variable plusieurs fois dans l'instruction case. Est-il possible de faire quelque chose comme ça dans le shell Bash?
color_code=$(case "$COLOR" in
(red) 1;;
(yellow) 2;;
(green) 3;;
(blue) 4;;
esac)
(Ou, en passant, dans d'autres coquilles?)
bash
shell
assignment
case
iconoclaste
la source
la source
(
s supplémentaires . Sinon, ça va.Réponses:
La
variable=$(...)
construction prendra la sortie standard de n'importe quelle commande$(...)
et l'affectera àvariable
. Ainsi, pour êtrevariable
assigné comme vous le souhaitez, les valeurs doivent être envoyées à la sortie standard. Cela se fait facilement avec laecho
commande:Cela fonctionnera
bash
aussi bien sur tous les autres shells POSIX.Les parens gauche en option
Selon la norme POSIX, la parenthèse gauche dans une
case
instruction est facultative et la suivante fonctionne également:Comme Gilles le souligne dans les commentaires, tous les shells n'acceptent pas les deux formes en combinaison avec
$(...)
: pour un tableau de compatibilité incroyablement détaillé, voir "$ ()" substitution de commande vs embarqué ")" .la source
(
comme facultative. Je pensais que cela pourrait aider à éviter de laisser le)
mal interprété comme la fermeture)
de l'$(...)
expression.(
est facultative: le code fonctionne de la même manière sans ou sans eux. Je les ai laissés de côté uniquement parce que, pour le meilleur ou pour le pire, c'est la tradition. L'élément clé de la solution proposée est l'utilisation deecho
.(
pour lescase
modèles, mais certains shells l'ont fait et ont nécessité l'ouverture(
quandcase
est utilisé dans une substitution de commande. Les coquilles modernes sont bien de toute façon. Voir in-ulm.de/~mascheck/various/cmd-substcolor_code=$(…)
assigne la sortie de la…
commande à la variablecolor_code
, avec les retours à la ligne finaux supprimés. Vous devez donc produire une sortie. Le code que vous avez écrit tente de s'exécuter en1
tant que commande.Vous pouvez utiliser cet idiome. Notez qu'il
color_code
sera vide s'il$COLOR
n'y a aucune des valeurs prises en charge.Mais ce n'est pas très idiomatique. Le langage shell est orienté vers de simples combinaisons de commandes simples. Cette grosse substitution de commande est maladroite. La substitution de commande crée un sous-shell, qui est plus lent que la méthode simple:
La principale différence sémantique entre les deux approches est qu'elle
$(…)
crée un sous-shell, de sorte que toute affectation, sortie, redirection, etc. effectuée à l'intérieur n'a aucun effet à l'extérieur.la source