Tutaj pokazano użycie ||
iw &&
jednym wierszu do łączenia wykonywania poleceń: Jak mogę sprawdzić błędy apt-get w skrypcie bash?
Próbuję zatrzymać wykonywanie skryptu, jeśli określony warunek się nie powiedzie,
na przykład
false || echo "Obvious error because its false on left" && exit
Tutaj drukuje Obvious error because its false on the left
i wychodzi z konsoli, czego chciałem.
true || echo "This shouldn't print" && exit
Tutaj nie ma drukowania echa, ale exit
polecenie również się uruchamia, tzn. Konsola jest zamknięta, czy nie powinno się uruchomić exit
polecenia, ponieważ polecenie echa po prawej nie zostało wykonane? Czy też domyślnie stwierdzenie jest uważane za fałszywe po lewej stronie &&
operatora?
Edycja: Powinienem był o tym wspomnieć, moim celem było powtórzenie błędu i wyjście, jeśli nie było jasne. wrt do mojego szczególnego przypadku wyłapywania błędów podczas grupowania warunków za pomocą && i ||, @ bodhi.zazen odpowiedź rozwiązuje problem.
Odpowiedź @takatakatek wyjaśnia lepiej kontrolę przepływu, a linki prowadzące bash są doskonałe
Odpowiedź @muru ma dobre wyjaśnienie, dlaczego nie używać zestawu -e, jeśli chcesz wyświetlać niestandardowe komunikaty o błędach z alternatywami używania perla i pułapki, które moim zdaniem są bardziej niezawodne i widzę, że używam go od drugiego skryptu bash!
źródło
Odpowiedzi:
Prawdopodobnie chcesz (jak zauważył Steeldriver)
W przeciwnym razie skrypt będzie odczytywał jeden warunek naraz
a lub b, a następnie wyjdź
Myślę, że chcesz a lub (b i wyjść)?
źródło
{ ... ; }
(jak sugeruje @steeldriver), w przeciwnym razieexit
tylko wyjdzie z podpowłoki, a powłoka nadrzędna będzie kontynuowała wykonywanie skryptu.Problem polega na tym, że || i && pomiń tylko jedną kolejną zwrotkę łańcucha poleceń, gdy warunek się nie powiedzie. Jeśli napiszesz pełną strukturę bloków, ma to sens. To, co napisałeś, staje się następujące:
To, czego chcesz, to:
Kiedy używasz skrótowych operatorów warunkowych Basha, lepiej unikać ich mieszania. Logika jest znacznie łatwiejsza do zrozumienia podczas pisania, a czytelnicy docenią twój dobry styl.
źródło
if ... then ... elif ... else ... fi
bloków. Podejrzewam, że możesz nie wiedzieć, że Bash nie ma prawdziwych typów boolowskich w bardziej wyrafinowanych językach. Jeśli status wyjścia polecenia wynosi 0 (zero), Bash traktuje to jako prawda / sukces . Jeśli status wyjścia jest niezerowy, Bash traktuje to jako fałsz / niepowodzenie .Najprostszym sposobem na niepowodzenie w przypadku błędu jest użycie
-e
opcji bash (set -e
lub/bin/bash -e
w shebang). Nie ułatwia to jednak wysyłania niestandardowych komunikatów o błędach. Istnieje kilka idiomów, które mogą uprościć:die
à la PerlPerl ma bardzo wygodne
die
polecenie, które wypisuje komunikat do stderr i zgłasza wyjątek, który zwykle prowadzi do zakończenia skryptu. Możesz to naśladować:trap
ERR
trap <command>
Komenda może być użyty do uruchomienia polecenia, gdy odbierany jest sygnał, albo przy wychodzeniu (scenariusztrap ... EXIT
), lub gdy polecenie zwraca błąd (trap ... ERR
). Więc coś takiego:Następnie:
W obu przypadkach sugeruję użycie przynajmniej
exit 1
, aby wskazać, że skrypt nie powiódł się . Zwykłyexit
użyje statusu wyjścia poprzedniego polecenia, którym w takich przypadkach byłyby poleceniaecho
lubprintf
, które zwykle kończyłyby się powodzeniem. Zapisywanie statusu wyjścia nieudanego polecenia, tak jak to zrobiłem tutaj, byłoby przyjemne.źródło
Możesz spróbować poeksperymentować z uruchomieniem skryptu
-E zapewnia, że skrypt kończy działanie w momencie, gdy coś zwraca false. Dzięki temu można uniknąć określonej awarii
something || true
źródło