Mam funkcję, która zwraca 1, jeśli liczba jest poprawną dziesięciocyfrową liczbą:
valNum()
{
flag=1
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo "Invalid Number"
flag=0
fi
return $flag
}
Jest wywoływany przez:
if [[ $(valNum $num) -eq 1 ]]; then
#do something
fi
Funkcja działa poprawnie, jeśli liczba jest poprawna, ale wyświetla błąd składniowy, jeśli wprowadzi niepoprawną liczbę.
źródło
if valnum "$num"
jest równoważnyif valnum "$num" = 0
np. „jeśli to prawda”. podstawową zasadą w skryptach sh jest to, że 0 = prawda / sukces, niezerowa = fałsz / błąd.if [[ $(valNum $num) -eq 1 ]]
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.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:Jeśli chcesz później użyć kodu stanu, zapisz go w innej zmiennej, zanim
$?
zostanie zastąpiony przez następne polecenie.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ą, nigdy1
.Jeśli potrzebujesz przekazać więcej informacji, niż pozwala na to kod stanu z funkcji powłoki, masz dwie możliwości:
$(valNum "$num")
źródło
Sam miałem sprzeczne wyniki w tej dziedzinie. Oto wyniki z moich eksperymentów empirycznych. Po pierwsze, niektóre „ teorie ” na temat poleceń bash lub * nix:
Przykład:
Wynik:
Jak pokazano,
ls
polecenie zwraca kod stanu = 2. Podczas próby prawidłowego katalogu status ma wartość zero ( 0 ). Nie taki sam jak prawie wszystkie inne języki.reguła nr 1 - Make ...
Musimy pamiętać, że testujemy kody błędów w
if
instrukcji Bash . Ustawiam stałe lub możesz użyć powłokitrue
lubfalse
poleceń.i wyjście:
Sugeruję jednak, abyś oddał głos na „Gilles”, ponieważ jego odpowiedź jest poprawna. Chciałem tylko upraszczać stronę ePaper.
Jeszcze jedno,
test
polecenie. To wygląda jak:Większość czasu. I na przykład:
Zero (0) jest prawdą . Dlaczego? Otóż strona podręcznika mówi, że pojedynczy argument jest „ prawdziwy ”, gdy NIE jest NULL.
Bibliografia:
źródło