Das Problem bei anderen Antworten ist, dass sie entweder eine globale Funktion verwenden, die überschrieben werden kann, wenn sich mehrere Funktionen in einer Aufrufkette befinden, oder echo
dass Ihre Funktion keine Diagnoseinformationen ausgeben kann (Sie werden vergessen, dass Ihre Funktion dies tut und das "Ergebnis", dh zurück Wert, enthält mehr Informationen als Ihr Anrufer erwartet, was zu einem seltsamen Fehler führt) oder eval
der viel zu schwer und hackig ist.
Der richtige Weg, dies zu tun, besteht darin, das Material der obersten Ebene in eine Funktion local
einzufügen und eine mit Bashs dynamische Scoping-Regel zu verwenden. Beispiel:
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
Dies gibt aus
nothing
hi
bye
Dynamisches Scoping bedeutet, dass ret_val
je nach Anrufer auf ein anderes Objekt verweist! Dies unterscheidet sich vom lexikalischen Scoping, das in den meisten Programmiersprachen verwendet wird. Dies ist eigentlich eine dokumentierte Funktion , die leicht zu übersehen und nicht sehr gut erklärt ist. Hier ist die Dokumentation dazu (Schwerpunkt liegt bei mir):
Für die Funktion lokale Variablen können mit dem lokalen integrierten Element deklariert werden. Diese Variablen sind nur für die Funktion und die von ihr aufgerufenen Befehle sichtbar .
Für jemanden mit einem C / C ++ / Python / Java / C # / Javascript-Hintergrund ist dies wahrscheinlich die größte Hürde: Funktionen in Bash sind keine Funktionen, sie sind Befehle und verhalten sich als solche: Sie können an stdout
/ ausgeben stderr
, sie können einleiten / out können sie einen Exit-Code zurückgeben. Grundsätzlich gibt es keinen Unterschied zwischen dem Definieren eines Befehls in einem Skript und dem Erstellen einer ausführbaren Datei, die über die Befehlszeile aufgerufen werden kann.
Also anstatt dein Skript so zu schreiben:
top-level code
bunch of functions
more top-level code
schreibe es so:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
Dabei main()
deklariert ret_val
as local
und alle anderen Funktionen geben Werte über zurück ret_val
.
Siehe auch die folgende Unix- und Linux-Frage: Umfang lokaler Variablen in Shell-Funktionen .
Eine andere, vielleicht sogar bessere Lösung je nach Situation, ist derjenige von ya.teck geschrieben welche Anwendungen local -n
.
return
in deinem Fall ist im Wesentlichen der gleiche wieexit code
der Bereich von0 - 255
. Verwenden Sieecho
wie von @septi vorgeschlagen. Exit-Codes können mit erfasst werden$?
.