Odpowiedzi:
Jak powiedzieli inni, nie możesz tego zrobić.
Ale jeśli chcesz ułożyć kod w jeden plik, tak aby główny program znajdował się na górze pliku, a inne funkcje są zdefiniowane poniżej, możesz to zrobić, mając oddzielną mainfunkcję.
Na przykład
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
Kiedy wywołujemy mainna końcu pliku, wszystkie funkcje są już zdefiniowane. Wyraźnie przechodząc "$@"do mainjest wymagane, aby argumenty wiersza poleceń skryptu widocznego w funkcji.
Jawne exitw tym samym wierszu co wywołanie main nie jest obowiązkowe, ale można go użyć, aby zapobiec pomyłce działającego skryptu, jeśli plik skryptu zostanie zmodyfikowany. Bez tego powłoka po mainpowrocie próbowałaby czytać polecenia ze skryptu . (zobacz Jak odczytać cały skrypt powłoki przed jego uruchomieniem? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"wywołuję funkcję główną, dzięki czemu mogę ją pobrać w innym skrypcie bez Mainwykonywania. Następnie mogę ponownie użyć funkcji lub napisać testy, aby je sprawdzić.
main "$@"; exit(z exittą samą linią co main) jest również przydatne jako zabezpieczenie przed modyfikacją pliku podczas jego interpretacji.
exitten sam wiersz, ponieważ mainupewniamy się, że powłoka nie odczyta niczego z pliku po mainpowrocie.
main; exit, main; exit $?lub main <EOF>, we wszystkich przypadkach, kod zakończenia mainjest używany jako kod wyjścia skryptu. exitByłoby po prostu rzeczy, aby zapobiec coraz zawiedli jeśli ktoś edytuje skrypt przy włączonym silniku.
Nie, funkcje muszą istnieć w środowisku powłok w momencie ich wywoływania.
„Przewodnik po stylu Shell” firmy Google ma poprawkę:
Wywołana funkcja
mainjest wymagana dla skryptów wystarczająco długich, aby zawierały co najmniej jedną inną funkcję.
Na samym końcu skryptu, po wszystkich funkcjach, jako jedyna instrukcja, której nie ma w funkcji, miałbyś
main "$@"
Wywołałoby to mainfunkcję z dowolnymi parametrami podanymi przez skrypt. mainFunkcja może być umieszczony w górnej części skryptu (przewodnik styl mówi, aby umieścić go na dole, ale potem znowu, to mówi wiele rzeczy).
Gdy powłoka dotrze do mainwywołania, wszystkie funkcje w skrypcie zostały przeanalizowane i dlatego można je wywoływać z mainfunkcji.
Nie, funkcje muszą zostać zadeklarowane przed ich użyciem. Skrypty powłoki są odczytywane wiersz po wierszu i uruchamiane wiersz po wierszu; więc funkcja nie istnieje, dopóki jej deklaracja nie zostanie wykonana.
Cwygodnym miejscu.
. yourfile).
ifinstrukcji poza funkcją. Funkcja nie musi być definiowana, kiedy deklarujesz funkcję ifzawierającą, tylko kiedy ją wywołujesz .
Powłoka nie ma pojęcia o declaringfunkcji. Więc nie możesz mieć deklaracji przekazania.
W konsekwencji musisz mieć implementację funkcji odczytaną przez powłokę, zanim będzie można ją wywołać.
autoload fdeklaruje funkcję, ale jej ciało jest ładowane tylko przy pierwszym wywołaniu). Nie dotyczy to jednak PO bash.