In vielen Sprachen ist es möglich, das Ergebnis einer case / switch-Anweisung einer Variablen zuzuweisen, anstatt die Variablenzuweisung innerhalb der case-Anweisung viele Male zu wiederholen. Ist es möglich, so etwas in der Bash-Shell zu tun?
color_code=$(case "$COLOR" in
(red) 1;;
(yellow) 2;;
(green) 3;;
(blue) 4;;
esac)
(Oder nebenbei in anderen Muscheln?)
bash
shell
assignment
case
Bilderstürmer
quelle
quelle
(
s. Ansonsten ist es in Ordnung.Antworten:
Das
variable=$(...)
Konstrukt nimmt die Standardausgabe des Befehls$(...)
und weist sie zuvariable
. Umvariable
die gewünschte Zuordnung zu erhalten , müssen die Werte an die Standardausgabe gesendet werden. Dies ist einfach mit demecho
Befehl zu tun :Dies funktioniert
bash
genauso wie alle anderen POSIX-Shells.Die optionalen linken Parens
Gemäß dem POSIX-Standard sind die linken Parens in einer
case
Anweisung optional und Folgendes funktioniert ebenfalls:Wie Gilles in den Kommentaren hervorhebt, akzeptieren nicht alle Shells beide Formen in Kombination mit
$(...)
: Eine beeindruckend detaillierte Tabelle der Kompatibilität finden Sie unter "$ ()" Befehlssubstitution vs. eingebettet ")" .quelle
(
als optional aufgeführt. Ich dachte, es könnte helfen, zu vermeiden, dass das)
als Abschluss)
für den$(...)
Ausdruck falsch interpretiert wird .(
ist optional: Der Code funktioniert ohne oder ohne sie gleich. Ich habe sie nur deshalb weggelassen, weil das Tradition ist. Der Hauptteil der vorgeschlagenen Lösung ist die Verwendung vonecho
.(
fürcase
Muster, aber einige Shells haben das Öffnen zugelassen und erforderten das Öffnen,(
wenncase
es in einer Befehlssubstitution verwendet wird. Moderne Muscheln sind in beiden Fällen in Ordnung. Siehe inulm.de/~mascheck/various/cmd-substcolor_code=$(…)
Weist die Ausgabe des…
Befehls der Variablen zucolor_code
, wobei die letzten Zeilenumbrüche entfernt werden. Sie müssen also eine Ausgabe produzieren. Der von Ihnen geschriebene Code versucht,1
als Befehl ausgeführt zu werden.Sie können diese Redewendung verwenden. Beachten Sie, dass
color_code
dies leer ist, wenn$COLOR
keiner der unterstützten Werte vorhanden ist.Aber es ist nicht sehr idiomatisch. Die Shell-Sprache ist auf einfache Kombinationen einfacher Befehle ausgerichtet. Diese große Befehlsersetzung ist umständlich. Durch die Befehlssubstitution wird eine Unterschale erstellt, die langsamer ist als die einfache Methode:
Der semantische Hauptunterschied zwischen den beiden Ansätzen besteht darin, dass
$(…)
eine Unterschale erstellt wird, sodass jede Zuweisung, Beendigung, Umleitung usw., die innerhalb ausgeführt wird, keine Auswirkung außerhalb hat.quelle