Antworten:
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, ohne Main
sie auszuführen. Dann kann ich die Funktionen wiederverwenden oder Tests schreiben, um sie zu überprüfen.
main "$@"; exit
(mit exit
auf der gleichen Linie wie main
) ist auch als ein Schutz gegen die Datei geändert wird , während es interpretiert wird.
exit
in dieselbe Zeile setzen main
, stellen Sie sicher, dass die Shell nach der main
Rückgabe nichts mehr aus der Datei liest .
main; exit
, main; exit $?
oder main <EOF>
in allen Fällen wird der Exit-Code von main
als Exit-Code des Skripts verwendet. Das exit
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:
Eine aufgerufene Funktion
main
ist erforderlich, damit Skripte mindestens eine weitere Funktion enthalten.
Ganz am Ende des Skripts, nachdem alle Funktionen, als einzige Anweisung nicht in einer Funktion, hätten Sie
main "$@"
Dies würde die main
Funktion mit allen Parametern aufrufen, die dem Skript gegeben wurden. Die main
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 der main
Funktion aufgerufen werden.
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.
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.
autoload f
die Funktion deklariert wird, ihr Body jedoch erst beim ersten Aufruf geladen wird). Dies gilt jedoch nicht für die OPs bash
.