Il problema con altre risposte è che usano un globale, che può essere sovrascritto quando diverse funzioni sono in una catena di chiamate, o echo
che 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 eval
che è troppo pesante e caotico.
Il modo corretto per farlo è quello di mettere le cose di livello superiore in una funzione e usare una local
regola 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_val
punta 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_val
come local
e 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
.
return
nel tuo caso è essenzialmente lo stesso diexit code
quale intervallo da0 - 255
. Utilizzareecho
come suggerito da @septi. I codici di uscita possono essere acquisiti con$?
.