Z góry przepraszam, jeśli jest to duplikat pytania. Przed zapytaniem tutaj postarałem się wyszukać / sprawdzić.
Nie mam nic przeciwko pisaniu takich linijek:
foocommand && foocommand2 && foocommand3
Chodzi o to, że chcę, aby kolejne polecenia były uruchamiane tylko wtedy, gdy poprzednie było „udane”.
Piszę dość długi skrypt, a ten jednowierszowy program jest niewykonalny, ponieważ dla wszystkich innych wygląda na ogromny blok mylącego kodu.
Chcę rozdzielić polecenia i napisać między nimi komentarze w skrypcie. Jak mogę to zrobić i nadal mieć odpowiednik &&?
&&
nie znaczy późniejsza komenda będzie działać, jeśli poprzednie jeden był udany. Oznacza to polecenie będzie działać, jeśli zbiorowy wynik wśród wszystkich poprzednich poleceń na liście poleceń jest sukcesem. Być może wiesz o tym, ale przyszli czytelnicy mogą źle zrozumieć.||
i&&
(w przeciwieństwie do|
lub&
) nazywa się zwarciem. Zachowanie stosowane w przypadku tych ostatnich operatorów nazywa się chętną oceną.a && b && c
będzie działać tylko,b
jeśli sięa
powiedzie, więc „działa tylko,c
jeśli sięb
powiedzie” i „działa tylko,c
jeślia
ib
oba się uda” są równoważnymi instrukcjami:b
nie można odnieść sukcesu, chyba że sięa
powiedzie.a || b && c
jest bardziej ilustracyjny.true || false && echo hi
wyświetlihi
. Specyfikacja brzmi: Operatory „&&” i „||” będą miały równe pierwszeństwo i będą oceniane z pozostawionym skojarzeniem.Odpowiedzi:
Możesz to zrobić w następujący sposób:
Mam nadzieję, że zrozumiałem, o co prosiłeś
źródło
Możesz zmienić linię shebang na
Po każdym błędzie skrypt przestanie działać.
źródło
bash
części oczywiście). Powłoka POSIX ma wiele opcji, które można zastosowaćset
. Lub odwrotnie?set
to sposób ustawiania opcji wiersza poleceń powłoki w skrypcie.-e
mogą się źle zachowywać. Na przykład prawdopodobnie nie chcesz, aby skrypt kończył się za każdym razem, gdydiff
dwa nieidentyczne pliki. Możesz oczywiście obejść ten problem, dodając|| true
(lub być może|| [ $? = 1 ]
) do takich poleceń, ale OP wspomina o „wszystkich innych”, którzy będą musieli przeczytać ten skrypt, i powiedział, że „wszyscy inni” prawdopodobnie nie będą przyzwyczajeni do konieczności poradzić sobie z-e
.-e
włączałem ją, dopóki jeden z administratorów mojej firmy nie uruchamiał moich skryptówbash myscript.sh
, więc to zignorowało-e
. Teraz wszystkie moje skrypty mająset -e
drugą linię.Jeśli nie podoba ci się ten
set -e
pomysł, być może możesz odwrócić logikę.Bardziej użyteczne, zamień na
exit
coś, aby wydrukować przydatny komunikat o błędzie, a następnie wyjdź. Oczywiście wewnątrz funkcji chceszreturn
zamiastexit
.źródło
foocommand || exit
wyjść zefoocommand
statusem wyjścia, jeśli niezerowy.Zamiast tego możesz użyć
if else fi
bloków.Jest trochę bardziej czytelny.
Alternatywnie możesz po prostu użyć,
\
aby rozbić swój duży 1 liniowiec na kilka liniiAle może to być mylące dla niewprawnego oka.
źródło
\
to konieczne.Możesz rozważyć użycie
if
instrukcji zagnieżdżonych . Inną opcją jest użycie curly's do grupowania jak{ true && echo hi; } || echo huh
Aktualizacja 1:
Oto przykład bez nowych linii / komentarzy:
źródło
Podziel każdą sekwencję poleceń na funkcje:
źródło
Zawsze lubię pisać funkcję „fail”, która pozwala mi określić, co zamierzam zrobić, kiedy wystąpiła awaria, a następnie użyć
||
wzorca. Podobnie jak poniżej:źródło