Nowe ;&
i ;;&
operatory zostały wprowadzone w Bash
4.0
i chociaż oba mogą być przydatne w podobnych sytuacjach, myślę, że nie są one przydatne w twoim przypadku. Oto, co man bash
mówi o tych operatorach:
Jeśli ;; operator jest używany, po pierwszym dopasowaniu wzorca nie są podejmowane żadne kolejne dopasowania. Używanie; & zamiast ;; powoduje kontynuowanie wykonywania listy powiązanej z następnym zestawem wzorców. Używanie ;; & zamiast ;; powoduje, że powłoka testuje następną listę wzorców w instrukcji, jeśli taka istnieje, i wykonuje dowolną powiązaną listę w przypadku pomyślnego dopasowania.
Innymi słowy, ;&
jest to spadek po a jak wiemy to od C
i
;;&
marki bash
sprawdzić pozostałych przypadkach zamiast powrocie z
case
bloku całkowicie. Dobry przykład ;;&
działania można znaleźć tutaj: /programming//a/24544780/3691891 .
To powiedziawszy, ani ;&
ani nie ;;&
mogą być użyte w twoim skrypcie, ponieważ obaj przejdą do *)
tego, że zawsze będzie uruchamiany.
Poniższy skrypt działa i robi, co chcesz, bez ponownego układania logiki, ale traktuj to tylko jako przykład i nigdy nie polegaj na nim, jest zbyt delikatny. Pomysł wziąłem
stąd :
#!/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
części kodu do tego, co jest w środku*)
? Ponieważ to całkowicie różni się od tego, co nazywa się upadkiem, dlatego frazowanie pytania jest nieco mylące.