Szukam sposobu, aby nastąpił upadek w oparciu o warunek if w warunku case w bash. Na przykład:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
W powyższym kodzie, jeśli zmienna VAR
jest 1
, chciałbym, aby warunek case wykonał przewrót.
bash
shell-script
case
Smashgen
źródło
źródło
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.Odpowiedzi:
Nie możesz Sposobem na
case
upadek jest zastąpienie;;
separatora;&
(lub;;&
). I to błąd składniowy, aby umieścić to w if.Możesz zapisać całą logikę jako zwykły warunek:
źródło
if
.Sugerowałbym restrukturyzację logiki: zamiast tego umieść kod „awaryjny” w funkcji:
wyjścia
źródło
Poniższy skrypt zamienia twój test „na lewą stronę” w tym sensie, że
$var
najpierw testujemy, a następnie przeprowadzamy przegląd (użycie;&
wcase
) w zależności od$input
.Robimy to, ponieważ pytanie, czy „przeprowadzić upadek” zależy od tego,
$input
czy tak$var
jest1
. Jeśli jest to jakaś inna wartość, nie trzeba nawet zadawać pytania, czy dokonać przełomu.Lub bez
case
:źródło
*)
. Mam już +1.Nie coś, co bym zrobił, ale można osiągnąć coś zbliżającego się:
źródło
Przetestuj obie zmienne jednocześnie (bash 4.0-alpha +):
Podczas testowania:
Czysty i prosty.
Zrozum, że testowana wartość (
$new
) musi mieć tylko dwie możliwe wartości, dlatego istnieje klauzula if, aby przekształcić VAR w wartość logiczną. Jeśli VAR może być ustawiony jako logiczny, to sprawdź0
(nie1
) wcase
i usuńif
.źródło
Możesz ustawić domyślną wartość domyślną, ale ustawić warunek, aby kod był wykonywany tylko wtedy, gdy warunek jest spełniony
Ale jak sugeruje ilkkachu, możesz również używać warunków zamiast przełączać.
źródło
Jeśli nie przeszkadza Ci, że ktoś narzeka, że nie rozumie Twojego kodu, możesz po prostu zmienić kolejność dwóch warunków warunkowych:
Lub:
Proste i jasne (przynajmniej dla mnie).
case
nie obsługuje samego upadku. Ale można zastąpić*)
z&&
POesac
, aby w odniesieniu do wartości zwracanej z innych oddziałów.źródło
Nowe
;&
i;;&
operatory zostały wprowadzone wBash
4.0 i chociaż oba mogą być przydatne w podobnych sytuacjach, myślę, że nie są one przydatne w twoim przypadku. Oto, coman bash
mówi o tych operatorach:Innymi słowy,
;&
jest to spadek po a jak wiemy to odC
i;;&
markibash
sprawdzić pozostałych przypadkach zamiast powrocie zcase
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 :
źródło
jumpto
funkcji i wykonuje wszystko, co nastąpi po niej. Fakt, że jest to równoważne z kontynuowaniem wykonywania po bloku pomiędzyft:
i;;
jest zbiegiem okoliczności, ponieważjumpto
jest to ostatnie polecenie w tym samym złożonym poleceniu co przeskakujący blok.