Nie można zwrócić dowolnego wyniku z funkcji powłoki. Możesz zwrócić tylko kod stanu, który jest liczbą całkowitą z przedziału od 0 do 255. (Chociaż możesz przekazać większą wartość return
, jest on obcinany modulo 256.) Wartość musi wynosić 0, aby wskazać sukces, a inną wartość, aby wskazać niepowodzenie; zgodnie z konwencją powinieneś trzymać się kodów błędów od 1 do 125, ponieważ wyższe wartości mają specjalne znaczenie (złe zewnętrzne polecenie dla 126 i 127, zabite sygnałem dla wyższych wartości).
Ponieważ zwracasz tutaj wynik „tak lub nie”, kod statusu jest odpowiedni. Ponieważ flag
wydaje się wskazywać na sukces lub porażkę, powinieneś użyć konwencjonalnych wartości 0 dla sukcesu i 1 dla niepowodzenia (odwrotnie niż to, co napisałeś). Następnie możesz użyć swojej funkcji bezpośrednio w instrukcji if.
valNum ()
{
local flag=0
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo 1>&2 "Invalid Number"
flag=1
fi
return $flag
}
if valNum "$num"; then
#do something
fi
Jeśli chcesz rozróżnić kody błędów, wywołaj funkcję bezpośrednio. Natychmiast po powrocie kod błędu jest dostępny w $?
. Następnie możesz to sprawdzić za pomocą instrukcji case:
valNum "$num"
case $? in …
Jeśli chcesz później użyć kodu stanu, zapisz go w innej zmiennej, zanim $?
zostanie zastąpiony przez następne polecenie.
valNum "$num"
valNum_status=$?
To, co napisałeś, nie zadziałało, ponieważ podstawienie polecenia $(…)
rozwija się do wyniku funkcji, która w kodzie jest albo komunikatem o błędzie, albo pustą, nigdy 1
.
Jeśli potrzebujesz przekazać więcej informacji, niż pozwala na to kod stanu z funkcji powłoki, masz dwie możliwości:
- Wydrukuj tekst na standardowym wyjściu i wywołaj funkcję w podstawieniu polecenia:
$(valNum "$num")
- Przypisz jedną lub więcej zmiennych wewnątrz funkcji i przeczytaj te zmienne później.