Wie andere gesagt haben, kann man das nicht tun.
Wenn Sie den Code jedoch so in einer Datei anordnen möchten, dass sich das Hauptprogramm oben in der Datei befindet und andere Funktionen unten definiert sind, können Sie dies mit einer separaten main
Funktion tun .
Z.B
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
Wenn wir main
am Ende der Datei aufrufen , sind alle Funktionen bereits definiert. Die explizite Übergabe "$@"
an main
ist erforderlich, um die Befehlszeilenargumente des Skripts in der Funktion sichtbar zu machen.
Der explizite Eintrag exit
in derselben Zeile wie der Aufruf von main ist nicht obligatorisch, kann jedoch verwendet werden, um zu verhindern, dass ein ausgeführtes Skript durcheinander gebracht wird, wenn die Skriptdatei geändert wird. Ohne dies würde die Shell versuchen, nach der main
Rückkehr weitere Befehle aus der Skriptdatei zu lesen . (Siehe Wie lese ich das gesamte Shell-Skript, bevor ich es ausführe? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
, um die Hauptfunktion aufzurufen, damit ich sie in einem anderen Skript verwenden kann, ohneMain
sie auszuführen. Dann kann ich die Funktionen wiederverwenden oder Tests schreiben, um sie zu überprüfen.main "$@"; exit
(mitexit
auf der gleichen Linie wiemain
) ist auch als ein Schutz gegen die Datei geändert wird , während es interpretiert wird.exit
in dieselbe Zeile setzenmain
, stellen Sie sicher, dass die Shell nach dermain
Rückgabe nichts mehr aus der Datei liest .main; exit
,main; exit $?
odermain <EOF>
in allen Fällen wird der Exit-Code vonmain
als Exit-Code des Skripts verwendet. Dasexit
wäre nur, um zu verhindern, dass Dinge durcheinander geraten, wenn jemand das Skript bearbeitet, während es läuft.Nein, die Funktionen müssen zum Zeitpunkt des Aufrufs in der Shell-Umgebung vorhanden sein.
Googles "Shell Style Guide" hat eine Lösung für dieses Problem:
Ganz am Ende des Skripts, nachdem alle Funktionen, als einzige Anweisung nicht in einer Funktion, hätten Sie
Dies würde die
main
Funktion mit allen Parametern aufrufen, die dem Skript gegeben wurden. Diemain
Funktion könnte sich am oberen Rand des Skripts befinden (der Styleguide sagt, dass sie am unteren Rand stehen soll, aber andererseits sagt sie viele Dinge).Wenn die Shell zum
main
Aufruf gelangt, wurden alle Funktionen im Skript analysiert und können daher innerhalb dermain
Funktion aufgerufen werden.quelle
Nein, Funktionen müssen deklariert werden, bevor sie verwendet werden. Shell-Skripte werden Zeile für Zeile gelesen und Zeile für Zeile ausgeführt. Eine Funktion existiert also erst, wenn ihre Deklaration ausgeführt wurde.
quelle
C
es ist bequem.. yourfile
).if
Anweisungen außerhalb einer Funktion. Die Funktion muss nicht definiert werden, wenn Sie die -containing-Funktion deklarierenif
, sondern nur, wenn Sie sie aufrufen .Die Shell hat kein
declaring
Funktionskonzept. Sie können also keine Vorwärtsdeklaration haben.Folglich muss die Funktionsimplementierung von der Shell gelesen werden, bevor sie aufgerufen werden kann.
quelle
autoload f
die Funktion deklariert wird, ihr Body jedoch erst beim ersten Aufruf geladen wird). Dies gilt jedoch nicht für die OPsbash
.