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 bezMain
wykonywania. Następnie mogę ponownie użyć funkcji lub napisać testy, aby je sprawdzić.main "$@"; exit
(zexit
tą samą linią comain
) 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 pomain
powrocie.main; exit
,main; exit $?
lubmain <EOF>
, we wszystkich przypadkach, kod zakończeniamain
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ę:
Na samym końcu skryptu, po wszystkich funkcjach, jako jedyna instrukcja, której nie ma w funkcji, miałbyś
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ć zmain
funkcji.źródło
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.
źródło
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ć.
źródło
autoload f
deklaruje funkcję, ale jej ciało jest ładowane tylko przy pierwszym wywołaniu). Nie dotyczy to jednak PObash
.