Ich möchte mir im Grunde ein bash-Skript schreiben, wo ich ein paar große Dateien mit erstellen würde heredoc ; und dann einige Befehle mit diesen Dateien ausführen.
Es versteht sich, dass (offensichtlich) die heredoc-Dateien generiert werden müssen, bevor die Befehle ausgeführt werden - was mich jedoch irritiert, ist, dass ich auch den 'heredoc' -Anweisungscode schreiben muss, vor Ich schreibe den Befehlscode.
Also dachte ich, ich würde die heredoc-Anweisungen in einer Funktion schreiben - aber immer noch das gleiche Problem: Kapitel 24 Funktionen sagt:
Die Funktionsdefinition muss dem ersten Aufruf vorangestellt sein. Es gibt keine Methode, die Funktion zu "deklarieren", wie zum Beispiel in C.
Tatsächlich ist es so:
%Vor% Dann dachte ich, ich könnte vielleicht ein paar Labels platzieren und mit GOTO
herumspringen, wie in (Pseudocode):
... aber es stellt sich heraus, BASH goto existiert auch nicht .
Mein einziges Ziel ist das - ich möchte zuerst den "Kern" der Skriptdatei schreiben, was etwa fünf bis sechs Befehle sind; und nur then schreiben die heredoc-Anweisungen in die Skriptdatei (die Hunderte von Zeilen enthalten kann); Wenn ich die heredocs zuerst habe, macht es mir wirklich schwer, den Code zu lesen. Gibt es einen Weg, das zu erreichen?
In Bash müssen Sie die gesamte Funktion vor dem Aufruf definieren. Wenn Sie zuerst das Kernskript schreiben möchten, können Sie die Anweisungen von here- doc in eine andere Skriptdatei schreiben und sie bei Bedarf aufrufen und die zurückgegebenen Werte Ihrem Kernskript zuweisen.
BASH scannt die Datei linear und führt Anweisungen so aus, wie sie auf sie stoßen, genau wie in der Befehlszeile. Es gibt zwei Möglichkeiten, wie ich das tun kann, was Sie wollen. Zuerst könnten Sie den code-generierenden heredoc, etc. in eine separate Datei schreiben (zB helperfile.sh) und mit . helperfile.sh
versehen. Das ist wahrscheinlich das Beste. Du könntest auch am Anfang eine Funktion schreiben ( main
vielleicht), die das tut, was du willst, dann den heredoc code, dann unten am unteren Rand main
.