Jak mogę zrobić coś takiego w bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
bash
control-flow
Michał Mrożek
źródło
źródło
then
w osobnej linii.if ! command ; then ... ; fi
.[
sam w sobie jest poleceniem i w tym przypadku nie jest potrzebny.if [ ! command ]
nie wykonujecommand
; traktujecommand
jak ciąg i traktuje to jako prawdziwe, ponieważ ma niezerową długość.[
jest synonimemtest
poleceniaW przypadku drobnych rzeczy, które mają się zdarzyć, jeśli polecenie powłoki działa, możesz użyć
&&
konstrukcji:Podobnie w przypadku drobnych rzeczy, które mają się zdarzyć, gdy polecenie powłoki nie powiedzie się, możesz użyć
||
:Lub obydwa
Prawdopodobnie nierozsądnie jest robić wiele z tymi konstruktami, ale czasami mogą sprawić, że przepływ kontroli będzie znacznie wyraźniejszy.
źródło
Sprawdź wartość
$?
, która zawiera wynik wykonania ostatniego polecenia / funkcji:źródło
if
idiomu Basha . Wolę odpowiedź Keitha Thompsona.if
jest to zrobić. Warunki kontroli przepływu w Bash sprawdzają się$?
za kulisami; właśnie to robią. Jawne badanie jego wartości powinno być niepotrzebne w zdecydowanej większości przypadków i zwykle stanowi dla początkującego przeciwnika.if ! cmd
jest w porządku. W przeciwnym razie powszechnym rozwiązaniem jest użycieelse
klauzuli. Nie możesz mieć pustego,then
ale czasami widzisz,then : nothing; else
gdzie:
brak op jest znaczący.true
też by tam działał.To działało dla mnie:
jeśli się
command
powiedzie,echo "OK"
zostanie wykonany, a ponieważ się powiedzie, wykonanie się tam kończy. W przeciwnym razie&&
jest pomijany iecho "NOK"
wykonywany.źródło
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?echo "OK"
część sama mogłaby zawieść, to lepiej:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Należy zauważyć, że
if...then...fi
i&&
/ lub||
typ podejścia dotyczy statusu wyjścia zwracanego przez polecenie, które chcemy przetestować (0 w przypadku powodzenia); jednak niektóre polecenia nie zwracają niezerowego statusu wyjścia, jeśli polecenie zakończyło się niepowodzeniem lub nie mogło poradzić sobie z danymi wejściowymi. Oznacza to, że zwykłeif
i&&
/||
podejścia nie będą działać dla tych konkretnych poleceń.Na przykład w systemie Linux GNU
file
nadal wychodzi z 0, jeśli otrzymał nieistniejący plik jako argument ifind
nie mógł zlokalizować określonego pliku użytkownika.W takich przypadkach jednym potencjalnym sposobem na poradzenie sobie z sytuacją jest odczyt
stderr
/stdin
komunikaty, np. Te, które zwróciłyfile
polecenie lub parsują dane wyjściowe polecenia jak wfind
. W tym celucase
można użyć instrukcji.źródło
Najbardziej podatny na błędy, jaki mogłem wymyślić, to:
RR=$?
Teraz, nie tylko dla tej sytuacji, ale dla innych, z którymi możesz się spotkać, rozważ:
zdefiniowana zmienna:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Odpowiedź: tak
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Odpowiedź: nie
niezdefiniowana zmienna:
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Odpowiedź: nie
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Odpowiedź: tak
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Odpowiedź: tak
Zapobiega to wszelkiego rodzaju błędom.
Prawdopodobnie znasz całą składnię, ale oto kilka wskazówek:
"blank"
byćnothing
.${variable}
.base-8
. Pojawi się błąd, taki jak:value too great for base (error token is "08")
dla liczb powyżej7
. Właśnie wtedy10#
wchodzi w grę:10#
wymusza, aby liczba byłabase-10
.źródło
Możesz to zrobić:
źródło
ping
są przechwytywane w celu uruchomienia jako polecenia. Ale ponieważ dane wyjściowe są przekierowywane do / dev / null, który zawsze będzie pustym ciągiem. Więc nic nie uruchamiasz w podpowłoce, co oznacza, że poprzedni status wyjścia (podpowłoki zastępowania poleceń, czyli ping) zostanie zachowany. Oczywiście poprawna droga jestif ping ...; then
tutaj.Jak zauważono w innym miejscu tego wątku, pierwotne pytanie w zasadzie odpowiada samo. Oto ilustracja pokazująca, że
if
warunki mogą być również zagnieżdżone.W tym przykładzie użyto
if
do sprawdzenia, czy plik istnieje i czy jest to zwykły plik. Jeśli te warunki są spełnione, sprawdź, czy ma rozmiar większy niż 0.źródło
źródło
Można to zrobić po prostu w ten sposób, ponieważ
$?
daje status ostatniego wykonanego polecenia.Tak może być
źródło