Dlaczego powinieneś przejmować się tym, co mówię, pomimo ponad 250 pozytywnych odpowiedzi
To nie tak 0 = true
i 1 = false
. Jest to: zero oznacza brak awarii (sukces), a niezerowe oznacza uszkodzenie (typu N) .
Podczas gdy wybrana odpowiedź jest technicznie „true” proszę nie umieszczać return 1
** w kodzie na false . Będzie miał kilka niefortunnych skutków ubocznych.
- Doświadczeni programiści zauważą Cię jako amatora (z poniższego powodu).
- Doświadczeni programiści tego nie robią (z wszystkich powodów poniżej).
- Jest podatny na błędy.
- Nawet doświadczeni programiści mogą pomylić 0 i 1 odpowiednio jako fałszywe i prawdziwe (z powyższego powodu).
- Wymaga (lub będzie zachęcać) obcych i śmiesznych komentarzy.
- Jest to w rzeczywistości mniej pomocne niż niejawne statusy zwrotu.
Naucz się bashu
Podręcznik bash mówi (moje podkreślenie)
powrót [n]
Powoduje, że funkcja powłoki przestaje działać i zwraca wartość n swojemu wywołującemu. Jeśli nie podano n , zwracana wartość to status wyjścia ostatniego polecenia wykonanego w funkcji.
Dlatego nie musimy NIGDY używać 0 i 1, aby wskazać Prawda i Fałsz. Fakt, że robią to, jest w zasadzie trywialną wiedzą przydatną tylko do debugowania kodu, pytań do wywiadu i zaskakiwania umysłów początkujących.
Podręcznik bash również mówi
w przeciwnym razie stanem zwrotnym funkcji jest status wyjścia ostatniego wykonanego polecenia
Podręcznik bash również mówi
( $? ) Rozwija się do statusu wyjścia ostatnio wykonywanego potoku pierwszego planu .
Zaraz, poczekaj. Rurociąg? Jeszcze raz przejdźmy do instrukcji bash .
Potok jest sekwencją jednego lub więcej poleceń oddzielonych jednym z operatorów sterujących „|” lub „| &”.
Tak. Powiedzieli, że 1 polecenie to potok. Dlatego wszystkie 3 cytaty mówią to samo.
$?
mówi ci, co się stało ostatnio.
- Pęka bąbelki.
Moja odpowiedź
Tak więc, chociaż @Kambus wykazał, że przy tak prostej funkcji nie return
jest wcale potrzebny. Myślę, że było nierealistycznie proste w porównaniu z potrzebami większości ludzi, którzy to przeczytają.
Dlaczego return
?
Jeśli funkcja zwraca status wyjścia ostatniego polecenia, po return
co w ogóle używać ? Ponieważ powoduje to, że funkcja przestaje działać.
Zatrzymaj wykonywanie w wielu warunkach
01 function i_should(){
02 uname="$(uname -a)"
03
04 [[ "$uname" =~ Darwin ]] && return
05
06 if [[ "$uname" =~ Ubuntu ]]; then
07 release="$(lsb_release -a)"
08 [[ "$release" =~ LTS ]]
09 return
10 fi
11
12 false
13 }
14
15 function do_it(){
16 echo "Hello, old friend."
17 }
18
19 if i_should; then
20 do_it
21 fi
Mamy tutaj ...
Wiersz 04
jest jawnym [-ish] zwróconym prawdą, ponieważ RHS &&
jest wykonywany tylko wtedy, gdy LHS był prawdziwy
Linia 09
zwraca wartość true lub false pasującą do stanu linii08
Linia 13
zwraca false z powodu linii12
(Tak, można to zagrać w golfa, ale cały przykład jest wymyślony).
Kolejny wspólny wzór
# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
echo "some_command failed"
fi
# Do this...
some_command
status=$?
if ! $(exit $status); then
echo "some_command failed"
fi
Zwróć uwagę, jak ustawienie status
zmiennej demistyfikuje znaczenie $?
. (Oczywiście, że wiesz, co to $?
znaczy, ale ktoś mniej znający się na tym od Ciebie będzie musiał go kiedyś Google. O ile twój kod nie zajmuje się handlem wysokimi częstotliwościami, okaż trochę miłości , ustaw zmienną.) Ale prawdziwą rzeczą na wynos jest „jeśli status „nie istnieje” lub odwrotnie „jeśli status wyjścia” można odczytać na głos i wyjaśnić ich znaczenie. Jednak ten ostatni może być nieco zbyt ambitny, ponieważ zobaczenie tego słowa exit
może sprawić, że pomyślisz, że wychodzi on ze skryptu, podczas gdy w rzeczywistości wychodzi z $(...)
podpowłoki.
** Jeśli absolutnie nalegasz na użycie return 1
fałszywego, sugeruję przynajmniej użyć return 255
zamiast tego. Spowoduje to, że twoje przyszłe ja lub inny programista, który będzie musiał utrzymywać Twój kod, będzie pytał „dlaczego to jest 255?” Wtedy będą przynajmniej uważać i będą mieli większą szansę na uniknięcie błędu.
function
słowo kluczowe,myfun() {...}
wystarczy