2012-11-27 13 views
64

Esiste una cosa simile in bash o almeno qualcosa di simile (aggirato) come le dichiarazioni di inoltro, ben noto in C/C++, ad esempio?Dichiarazioni di funzioni in avanti in uno script Bash o Shell?

Oppure esiste una cosa del genere perché ad esempio viene sempre eseguita in un passaggio (riga dopo riga)?

Se non ci sono dichiarazioni in avanti, cosa devo fare per rendere più semplice la lettura del mio script. È piuttosto lungo e queste definizioni di funzioni all'inizio, mescolate con variabili globali, rendono il mio script brutto e difficile da leggere/comprendere)? Sto chiedendo di imparare alcune ben note/migliori pratiche per questi casi.


Ad esempio:

# something like forward declaration 
function func 

# execution of the function 
func 

# definition of func 
function func 
{ 
    echo 123 
} 

risposta

135

grande domanda. Io uso un modello come questo per la maggior parte dei miei script:

#!/bin/bash 

main() { 
    foo 
    bar 
    baz 
} 

foo() { 
} 

bar() { 
} 

baz() { 
} 

main "[email protected]" 

È possibile leggere il codice da cima a fondo, ma non inizia l'esecuzione fino a quando l'ultima riga. Passando da "[email protected]" a main() è possibile accedere agli argomenti della riga di comando $1, $2 e così come si farebbe normalmente.

+3

Ciao, come si fa a struttura di dati che ha da condividere tra foo/bar/baz nel tuo esempio? Di solito lo metto solo in cima alla sceneggiatura. Questo è ancora il caso quando si usano le funzioni? O è meglio mettere i dati globali in main, e poi passarli a foo/bar/baz come argomenti? Qual è la migliore pratica? – bodacydo

+4

Preferisco gli argomenti. Escludendo, imposterò le variabili globali in 'main' o in una funzione subito dopo' main' (ad es. 'Setup' o' parseArguments'). Evito di avere le variabili globali impostate sopra 'main' - il codice non dovrebbe andare al di fuori di' main'. –

+0

Questo sembra un po 'analogo a ciò che 'if _ _ nome _ _ ==" _ _ main _ _ ": main()' fa in python –

26

Quando i miei script bash crescono troppo, usando la direttiva include meccanismo:

File allMyFunctions:

foo() { 
} 

bar() { 
} 

baz() { 
} 

File main:

#!/bin/bash 

. allMyfunctions 

foo 
bar 
baz 
+16

Personalmente, quando uno script di shell inizia a crescere oltre un file, tendo a passare a lingua diversa ;-) –

+0

Più 1 | Per [POSIX] (https://en.wikipedia.org/wiki/POSIX) -compliance. – Vlastimil