Il problema con altre risposte è che usano un globale, che può essere sovrascritto quando diverse funzioni sono in una catena di chiamate, o echoche significa che la tua funzione non può produrre informazioni diagnostiche (dimenticherai che la sua funzione fa questo e il "risultato", cioè restituisce valore, conterrà più informazioni di quelle che il tuo chiamante si aspetta, portando a strani bug) o evalche è troppo pesante e caotico.
Il modo corretto per farlo è quello di mettere le cose di livello superiore in una funzione e usare una localregola di scoping dinamica con bash. Esempio:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
Questo produce
nothing
hi
bye
Scoping dinamico significa che ret_valpunta a un oggetto diverso a seconda del chiamante! Questo è diverso dall'ambito lessicale, che è quello che usa la maggior parte dei linguaggi di programmazione. Questa è in realtà una funzionalità documentata , facile da perdere e non molto ben spiegata, ecco la documentazione per essa (l'enfasi è mia):
Le variabili locali alla funzione possono essere dichiarate con l'integrato locale. Queste variabili sono visibili solo alla funzione e ai comandi che invoca .
Per qualcuno con uno sfondo C / C ++ / Python / Java / C # / javascript, questo è probabilmente il più grande ostacolo: le funzioni in bash non sono funzioni, sono comandi e si comportano come tali: possono emettere in stdout/ stderr, possono reindirizzare / out, possono restituire un codice di uscita. Fondamentalmente non c'è alcuna differenza tra la definizione di un comando in uno script e la creazione di un eseguibile che può essere chiamato dalla riga di comando.
Quindi, invece di scrivere la tua sceneggiatura in questo modo:
top-level code
bunch of functions
more top-level code
scrivilo così:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
dove main()dichiara ret_valcome locale tutte le altre funzioni restituiscono valori tramite ret_val.
Vedi anche la seguente domanda Unix e Linux: Ambito delle variabili locali nelle funzioni della shell .
Un'altra soluzione forse ancora migliore a seconda della situazione è quella pubblicata da ya.teck che utilizza local -n.
returnnel tuo caso è essenzialmente lo stesso diexit codequale intervallo da0 - 255. Utilizzareechocome suggerito da @septi. I codici di uscita possono essere acquisiti con$?.