Risposte:
Come altri hanno già detto, non puoi farlo.
Ma se vuoi disporre il codice in un file in modo che il programma principale si trovi nella parte superiore del file e le altre funzioni siano definite di seguito, puoi farlo avendo una main
funzione separata .
Per esempio
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
Quando chiamiamo main
alla fine del file, tutte le funzioni sono già definite. È necessario passare esplicitamente "$@"
a main
per rendere visibili gli argomenti della riga di comando dello script nella funzione.
L'esplicito exit
sulla stessa riga della chiamata a main non è obbligatorio, ma può essere utilizzato per evitare che uno script in esecuzione venga incasinato se il file di script viene modificato. Senza di essa, la shell proverebbe a continuare a leggere i comandi dal file di script dopo i main
ritorni. (vedi Come leggere l'intero script della shell prima di eseguirlo? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
per chiamare la funzione principale in modo da poterlo rintracciare in un altro script senza Main
essere eseguito. Quindi posso riutilizzare le funzioni o scrivere test per controllarle.
main "$@"; exit
(con exit
sulla stessa riga di main
) è anche utile come protezione contro il file che viene modificato mentre viene interpretato.
exit
la stessa linea in quanto main
ci assicuriamo che la shell non rileggerà nulla dal file dopo la main
restituzione.
main; exit
, main; exit $?
o main <EOF>
, in ogni caso, il codice di uscita main
viene utilizzato come codice di uscita dello script. Il exit
sarebbe solo per evitare che le cose sempre incasinato se qualcuno modifica lo script mentre è in esecuzione.
No, le funzioni devono esistere nell'ambiente shell al momento della loro chiamata.
La "Guida allo stile di shell" di Google ha una correzione per questo:
Una funzione chiamata
main
è necessaria per gli script abbastanza a lungo da contenere almeno un'altra funzione.
Alla fine dello script, dopo tutte le funzioni, come unica affermazione non in una funzione, avresti
main "$@"
Ciò chiamerebbe la main
funzione con qualunque parametro sia stato dato lo script. La main
funzione potrebbe trovarsi nella parte superiore dello script (la guida di stile dice di metterla in fondo, ma poi dice molte cose).
Quando la shell arriva alla main
chiamata, tutte le funzioni nello script sono state analizzate e possono quindi essere richiamate dall'interno della main
funzione.
No, le funzioni devono essere dichiarate prima di essere utilizzate. Gli script della shell vengono letti riga per riga e agiscono riga per riga; quindi una funzione non esiste fino a quando non viene eseguita la sua dichiarazione.
C
è comodo.
. yourfile
).
if
dichiarazioni nude al di fuori di una funzione. Non è necessario definire la funzione quando si dichiara la if
funzione contenente, proprio quando la si chiama .
La shell non ha il concetto di declaring
una funzione. Quindi non puoi avere una dichiarazione in avanti.
Di conseguenza, è necessario che l'implementazione della funzione sia letta dalla shell prima che possa essere chiamata.
autoload f
dichiara la funzione, ma il suo corpo viene caricato solo alla prima invocazione). Ciò non si applica tuttavia ai PO bash
.