2012-11-27 6 views
64

Czy jest coś takiego w bash lub co najmniej coś podobnego (obejście), jak deklaracje forward, dobrze znane na przykład w C/C++?Deklaracje funkcji Forward w skrypcie Bash lub Shell?

Albo jest taka rzecz, ponieważ na przykład zawsze jest wykonywana w jednym przebiegu (linia po linii)?

Jeśli nie ma deklaracji przekazania, co należy zrobić, aby mój skrypt był łatwiejszy do odczytania. Jest dość długi i te definicje funkcji na początku, zmieszane ze zmiennymi globalnymi, czynią mój skrypt brzydkim i trudnym do odczytania/zrozumienia)? Proszę o zapoznanie się z dobrze znanymi/najlepszymi praktykami w takich przypadkach.


Na przykład:

# something like forward declaration 
function func 

# execution of the function 
func 

# definition of func 
function func 
{ 
    echo 123 
} 

Odpowiedz

135

Świetne pytanie. Używam takiego wzorca dla większości moich skryptów:

#!/bin/bash 

main() { 
    foo 
    bar 
    baz 
} 

foo() { 
} 

bar() { 
} 

baz() { 
} 

main "[email protected]" 

można odczytać kodu z góry do dołu, ale w rzeczywistości nie zacząć realizować do ostatniej linii. Przekazując "[email protected]" do main(), można uzyskać dostęp do argumentów wiersza poleceń: $1, $2 i innych, tak jak zwykle.

+3

Cześć, jak masz na struktury danych, które ma być podzielonym między foo/bar/baz w twoim przykładzie? Zwykle po prostu umieszczam go na górze skryptu. Czy nadal jest tak w przypadku korzystania z funkcji? Czy też lepiej jest umieścić dane globalne w main, a następnie przekazać je do foo/bar/baz jako argumenty? Jaka jest najlepsza praktyka? – bodacydo

+4

Preferuję argumenty. Poza tym ustawiam zmienne globalne w 'main' lub w funkcji zaraz po' main' (np. 'Setup' lub' parseArguments'). Unikam sytuacji, w której zmienne globalne są ustawione powyżej "głównego" - kod nie powinien wychodzić poza "główny". –

+0

To wydaje się być nieco analogiczne do tego, co "jeśli _ _ nazwa _ _ ==" _ _ główne _ _ ": główne()' robi w python –

26

Kiedy moje skrypty bash rosną zbyt dużo używam zawierać mechanizm:

pliku allMyFunctions:

foo() { 
} 

bar() { 
} 

baz() { 
} 

pliku main:

#!/bin/bash 

. allMyfunctions 

foo 
bar 
baz 
+16

Osobiście, gdy skrypt powłoki zaczyna rosnąć obok jednego pliku, mam tendencję do przełączania się na inny język ;-) –

+0

Plus 1 | Dla zgodności z [POSIX] (https://en.wikipedia.org/wiki/POSIX). – Vlastimil

Powiązane problemy