Come altri hanno detto, non puoi farlo.
Ma se vuoi disporre il codice in un file in modo che il programma principale sia in cima al file e altre funzioni siano definite di seguito, puoi farlo avendo un main separato funzione.
Per esempio.
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "example@unixlinux.online"; exit
Quando chiamiamo main alla fine del file, tutte le funzioni sono già definite. Passaggio esplicito di "example@unixlinux.online" a main è necessario per rendere visibili nella funzione gli argomenti della riga di comando dello script.
L'esplicito exit sulla stessa riga della chiamata a main non è obbligatoria, ma può essere utilizzata per evitare che uno script in esecuzione venga danneggiato se il file di script viene modificato. Senza di esso, la shell proverebbe a continuare a leggere i comandi dal file di script dopo main ritorna. (vedi Come leggere l'intero script della shell prima di eseguirlo?)
No, le funzioni devono esistere nell'ambiente shell al momento della loro chiamata.
La "Shell Style Guide" di Google ha una soluzione per questo:
Una funzione chiamata
mainè richiesto per gli script sufficientemente lunghi da contenere almeno un'altra funzione.
Alla fine dello script, dopo tutte le funzioni, come unica istruzione non in una funzione, avresti
main "example@unixlinux.online"
Questo chiamerebbe il main funzione con qualsiasi parametro sia stato fornito allo script. L'main la funzione potrebbe trovarsi all'inizio dello script (la guida di stile dice di metterla in fondo, ma poi dice molte cose).
Quando la shell arriva al main call, tutte le funzioni nello script sono state analizzate e possono quindi essere chiamate dall'interno di main funzione.
No, le funzioni devono essere dichiarate prima di essere utilizzate. Gli script di shell vengono letti riga per riga e agiti riga per riga; quindi una funzione non esiste finché la sua dichiarazione non è stata eseguita.