Chcę zwrócić wartość z funkcji wywołanej w skrypcie powłoki. Być może brakuje mi składni. Próbowałem użyć zmiennych globalnych. Ale to też nie działa. Kod to:
lockdir="somedir"
test() {
retval=""
if mkdir "$lockdir"
then # Directory did not exist, but it was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval="true"
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval="false"
fi
return retval
}
retval=test()
if [ "$retval" == "true" ]
then
echo "directory not created"
else
echo "directory already created"
fi
shell
return-value
Mridul Vishal
źródło
źródło
Odpowiedzi:
Funkcja Bash nie może zwrócić ciągu bezpośrednio, tak jak chcesz. Możesz zrobić trzy rzeczy:
Dotyczy to również niektórych innych muszli.
Oto jak zrobić każdą z tych opcji:
1. Struny echa
2. Status wyjścia powrotnego
3. Udostępnij zmienną
źródło
function
słowa kluczowego do definiowania funkcji bash. To sprawi, że będzie mniej przenośny. Usuwam to.Pracujesz zbyt ciężko. Twój cały skrypt powinien być:
ale nawet to jest prawdopodobnie zbyt szczegółowe. Zakodowałbym to:
ale wynikowy komunikat o błędzie jest nieco niejasny.
źródło
mkdir "$lockdir" || { echo "could not create lock dir" >&2 ; exit 1 ; }
(zwróć uwagę na;
przed zamykającym nawiasem klamrowym). Ponadto często definiuję funkcję fail, która przyjmuje opcjonalny parametr komunikatu, który wypisuje na stderr, a następnie kończy z kodem powrotu 1, umożliwiając mi użycie bardziej czytelnegomkdir "$lockdir" || fail "could not create lock dir"
.cmd || fail "error msg" || return 1
jeśli chcesz to zrobić, prawda?fail
funkcji używanej tylko w sytuacjach krytycznych.Jeśli to tylko test prawda / fałsz, miej swoją funkcję
return 0
na sukces ireturn 1
porażkę. Test wyglądałby wtedy:źródło
Myślę, że zwrócenie 0 dla sukcesu / 1 dla porażki (Glenn Jackman) i jasna i wyjaśniająca odpowiedź Olibre mówi wszystko; żeby wspomnieć o pewnego rodzaju podejściu "combo" dla przypadków, w których wyniki nie są binarne i wolisz ustawić zmienną zamiast "wypowiadać" wynik (na przykład, jeśli twoja funkcja RÓWNIEŻ ma coś powtarzać, to podejście będzie nie działa). Co wtedy? (poniżej Bourne Shell)
jak w (tak, przykład jest trochę głupi, to tylko .. przykład)
źródło
W przypadku, gdy masz jakieś parametry do przekazania do funkcji i chcesz otrzymać wartość w zamian. Tutaj przekazuję "12345" jako argument do funkcji i po przetworzeniu zwracam zmienną XYZ która zostanie przypisana do WARTOŚCI
Wynik:
źródło