Jak wyjść z funkcji, jeśli warunek jest prawdziwy bez zabijania całego skryptu, po prostu wróć do stanu sprzed wywołania funkcji.
Przykład
# Start script
Do scripty stuff here
Ok now lets call FUNCT
FUNCT
Here is A to come back to
function FUNCT {
if [ blah is false ]; then
exit the function and go up to A
else
keep running the function
fi
}
set -e
ustawiłeś u góry skryptu i swojąreturn 1
lub jakąkolwiek inną liczbę oprócz 0, cały skrypt zostanie zamknięty.||
Wtedy możliwe jest zwrócenie niezerowego kodu i kontynuowanie wykonywania skryptu.set -e
i zwracać wartości niezerowe, ponieważ w przeszłości mnie to zaskoczyło.Użyj
return
operatora:function FUNCT { if [ blah is false ]; then return 1 # or return 0, or even you can omit the argument. else keep running the function fi }
źródło
Jeśli chcesz powrócić z funkcji zewnętrznej z błędem bez
exit
ingerencji, możesz użyć tej sztuczki:do-something-complex() { # Using `return` here would only return from `fail`, not from `do-something-complex`. # Using `exit` would close the entire shell. # So we (ab)use a different feature. :) fail() { : "${__fail_fast:?$1}"; } nested-func() { try-this || fail "This didn't work" try-that || fail "That didn't work" } nested-func }
Wypróbuj to:
$ do-something-complex try-this: command not found bash: __fail_fast: This didn't work
Ma to tę dodatkową zaletę / wadę, że opcjonalnie można wyłączyć tę funkcję:
__fail_fast=x do-something-complex
.Zauważ, że powoduje to, że najbardziej zewnętrzna funkcja zwraca 1.
źródło
fail
, co tu robi okrężnica?:
Jest wbudowany operatora bash, który jest „nie-op”. Ocenia wyrażenie, ale nic z nim nie robi. Używam go do zamiany zmiennej, która zakończy się niepowodzeniem, jeśli zmienna nie jest zdefiniowana, co oczywiście nie jest.do-something-complex
? <code> checkPara () {if [$ 1 -lt $ 2]; następnie echo 3 $; fi; } zrób coś złożonego () {checkPara $ # 1 "Jakaś wiadomość ostrzegająca użytkownika, jak używać tej funkcji." echo "tak"} </code>do-something-complex
Pokazałbym użytkownikowi jakąś wiadomość i wróciłbym natychmiast, jeśli do funkcji nie został podany żaden parametr.checkPara
użyłbyś mojejfail
funkcji do wyjścia z całego stosu funkcji.code
blok nie działa w komentarzach do przepełnienia stosu). Biegnie dalejcheckPara
.