Neu ;&
und ;;&
Operatoren wurden in Bash
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, was man bash
über diese Operatoren sagt:
Wenn die ;; Wenn der Operator verwendet wird, werden nach der ersten Musterübereinstimmung keine nachfolgenden Übereinstimmungen versucht. Verwenden von; & anstelle von ;; bewirkt, dass die Ausführung mit der Liste fortgesetzt wird, die dem nächsten Satz von Mustern zugeordnet ist. Verwenden von ;; & anstelle von ;; veranlasst die Shell, die nächste Musterliste in der Anweisung zu testen, falls vorhanden, und eine zugehörige Liste für eine erfolgreiche Übereinstimmung auszuführen.
Mit anderen Worten, ;&
ist ein Sturz durch und wie wir es aus wissen C
und
;;&
macht bash
überprüfen übrigen Fälle stattdessen von der Rückkehr
case
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 :
#!/usr/bin/env bash
function jumpto
{
label=$1
cmd=$(sed -n "/$label:/{:a;n;p;ba};" "$0" | grep -v ':$')
cmd=$(echo "$cmd" | sed 's,;;,,')
cmd=$(echo "$cmd" | sed 's,esac,,')
eval "$cmd"
}
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
printf "perform fallthrough\n"
jumpto ft
else
printf "do not perform fallthrough\n"
fi
;;
*)
ft:
echo "fallthrough worked!"
;;
esac
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.