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ą main
funkcję.
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 main
na końcu pliku, wszystkie funkcje są już zdefiniowane. Wyraźnie przechodząc "$@"
do main
jest wymagane, aby argumenty wiersza poleceń skryptu widocznego w funkcji.
Jawne exit
w 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 main
powrocie 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 Main
wykonywania. Następnie mogę ponownie użyć funkcji lub napisać testy, aby je sprawdzić.
main "$@"; exit
(z exit
tą samą linią co main
) jest również przydatne jako zabezpieczenie przed modyfikacją pliku podczas jego interpretacji.
exit
ten sam wiersz, ponieważ main
upewniamy się, że powłoka nie odczyta niczego z pliku po main
powrocie.
main; exit
, main; exit $?
lub main <EOF>
, we wszystkich przypadkach, kod zakończenia main
jest używany jako kod wyjścia skryptu. exit
Był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
main
jest 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 main
funkcję z dowolnymi parametrami podanymi przez skrypt. main
Funkcja 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 main
wywołania, wszystkie funkcje w skrypcie zostały przeanalizowane i dlatego można je wywoływać z main
funkcji.
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.
C
wygodnym miejscu.
. yourfile
).
if
instrukcji poza funkcją. Funkcja nie musi być definiowana, kiedy deklarujesz funkcję if
zawierającą, tylko kiedy ją wywołujesz .
Powłoka nie ma pojęcia o declaring
funkcji. 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 f
deklaruje funkcję, ale jej ciało jest ładowane tylko przy pierwszym wywołaniu). Nie dotyczy to jednak PO bash
.