Ich suche nach einer Möglichkeit, ein Durchfallen zu ermöglichen, basierend auf einer if-Bedingung innerhalb einer Fallbedingung in bash. Beispielsweise:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
Wenn die Variable im obigen Code VAR
lautet 1
, möchte ich, dass die Fallbedingung durchfällt.
bash
shell-script
case
Smashgen
quelle
quelle
if [ $VAR -eq 1 ]; then
Teil des Codes zu dem zu springen , was sich darin befindet*)
? Denn das ist völlig anders als das, was Fallthrough genannt wird, was Ihre Fragestellung nur leicht irreführend macht.Antworten:
Das kannst du nicht. Der Weg zum
case
Durchfallen besteht darin, den;;
Separator durch;&
(oder;;&
) zu ersetzen . Und es ist ein Syntaxfehler, das in ein if zu setzen.Sie könnten die gesamte Logik als reguläre Bedingung ausschreiben:
quelle
if
.Ich würde vorschlagen, Ihre Logik neu zu strukturieren: Fügen Sie stattdessen den "Fallthrough" -Code in eine Funktion ein:
Ausgänge
quelle
Das folgende Skript dreht Ihren Test in dem Sinne "von innen nach außen", dass wir
$var
zuerst testen und dann den Fallthrough (unter Verwendung;&
von acase
) abhängig von durchführen$input
.Wir tun dies, weil die Frage, ob "der Fallthrough" durchgeführt werden soll oder nicht, wirklich nur davon abhängt,
$input
ob dies der Fall$var
ist1
. Wenn es sich um einen anderen Wert handelt, muss nicht einmal die Frage gestellt werden, ob der Fallthrough durchgeführt werden soll.Oder ohne
case
:quelle
*)
. Habe schon meine +1.Nicht etwas, was ich tun würde, aber Sie könnten etwas erreichen, das sich nähert mit:
quelle
Testen Sie beide Variablen gleichzeitig (Bash 4.0-Alpha +):
Beim Testen:
Sauber und einfach.
Verstehen Sie, dass der getestete Wert (
$new
) nur zwei mögliche Werte haben darf. Deshalb ist die if-Klausel vorhanden, um VAR in einen Booleschen Wert umzuwandeln. Wenn VAR als Boolescher Wert festgelegt werden kann, testen Sie das0
(nicht1
)case
und entfernen Sie dasif
.quelle
Sie können den Fallthrough-Standard festlegen, aber eine Bedingung festlegen, dass der Code nur ausgeführt wird, wenn die Bedingung erfüllt ist
Aber wie ilkkachu vorgeschlagen hat, können Sie auch Bedingungen verwenden, anstatt zu wechseln.
quelle
Wenn es Ihnen nichts ausmacht, wenn sich jemand darüber beschwert, dass er Ihren Code nicht versteht, können Sie einfach die Reihenfolge der beiden Bedingungen ändern:
Oder:
Einfach und klar (zumindest für mich).
case
unterstützt Fallthrough selbst nicht. Aber Sie können ersetzen*)
mit&&
nachesac
ihm auf die Rückgabewerte anderer Zweige machen zu respektieren.quelle
Neu
;&
und;;&
Operatoren wurden inBash
4.0 eingeführt und obwohl beide in ähnlichen Situationen nützlich sein könnten, denke ich, dass sie in Ihrem Fall keinen Nutzen haben. Dies ist, wasman bash
über diese Operatoren sagt:Mit anderen Worten,
;&
ist ein Sturz durch und wie wir es aus wissenC
und;;&
machtbash
überprüfen übrigen Fälle stattdessen von der Rückkehrcase
Block vollständig. Ein schönes Beispiel für eine;;&
Aktion finden Sie hier: /programming//a/24544780/3691891 .Davon abgesehen konnte weder
;&
noch;;&
in Ihrem Skript verwendet werden, da beide*)
dazu immer ausgeführt würden.Das folgende Skript funktioniert und macht, was Sie wollen, ohne die Logik neu zu ordnen, aber betrachten Sie es nur als Beispiel und verlassen Sie sich nie darauf, es ist zu zerbrechlich. Ich habe die Idee von hier genommen :
quelle
jumpto
Funktion zurück und führt alles aus, was danach kommt. Die Tatsache, dass dies gleichbedeutend ist mit der Fortsetzung der Ausführung nach dem Block zwischenft:
und;;
ist ein Zufall, da diesjumpto
der letzte Befehl in demselben komplexen Befehl ist wie der Sprungblock.