2012-11-27 2 views
64

Gibt es so etwas in bash oder zumindest etwas ähnliches (Workaround) wie Vorwärtsdeklarationen, zum Beispiel in C/C++ bekannt?Weiterleiten von Funktionsdeklarationen in einem Bash- oder Shell-Skript?

Oder gibt es so etwas, weil zum Beispiel es immer in einem Durchgang (Zeile für Zeile) ausgeführt wird?

Wenn keine Forward-Deklarationen vorhanden sind, was soll ich tun, damit mein Skript leichter lesbar ist? Es ist ziemlich lang und diese Funktionsdefinitionen am Anfang, gemischt mit globalen Variablen, lassen mein Skript hässlich und schwer lesbar erscheinen. Ich bitte darum, einige bekannte/bewährte Praktiken für solche Fälle zu lernen.


Zum Beispiel:

# something like forward declaration 
function func 

# execution of the function 
func 

# definition of func 
function func 
{ 
    echo 123 
} 

Antwort

135

Große Frage. Ich benutze ein Muster, wie dies für die meisten meiner Skripte:

#!/bin/bash 

main() { 
    foo 
    bar 
    baz 
} 

foo() { 
} 

bar() { 
} 

baz() { 
} 

main "[email protected]" 

Sie können den Code von oben nach unten lesen, aber es ist eigentlich erst beginnen, wenn die letzte Zeile ausgeführt wird. Durch Übergeben von "[email protected]" an main() können Sie auf die Befehlszeilenargumente $1, $2 usw. zugreifen, so wie Sie es normalerweise tun würden.

+3

Hallo, wie Sie Datenstruktur, die hat in deinem Beispiel zwischen foo/bar/baz geteilt werden? Normalerweise lege ich es einfach an die Spitze des Skripts. Ist dies bei der Verwendung von Funktionen noch immer der Fall? Oder ist es besser, globale Daten in main einzufügen und sie dann als Argumente an foo/bar/baz weiterzugeben? Was ist die beste Praxis? – bodacydo

+4

Ich bevorzuge Argumente. Abgesehen davon werde ich globale Variablen in 'main' oder in einer Funktion direkt nach' main' setzen (z. B. 'setup' oder' parseArguments'). Ich vermeide es, globale Variablen über 'main' zu setzen - Code sollte nicht außerhalb von' main' liegen. –

+0

Das erscheint etwas analog zu dem, was '_ _ _ _ _ = _ _ _ main _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _: main()' tut in Python –

26

Wenn mein Bash-Skripte zu viel wachsen, verwende ich einen Mechanismus enthalten:

Datei allMyFunctions:

foo() { 
} 

bar() { 
} 

baz() { 
} 

Datei main:

#!/bin/bash 

. allMyfunctions 

foo 
bar 
baz 
+16

Persönlich, wenn ein Shell-Skript beginnt, über eine Datei zu wachsen andere Sprache ;-) –

+0

Plus 1 | Für [POSIX] (https://en.wikipedia.org/wiki/POSIX) -Kompliance. – Vlastimil

Verwandte Themen