[gelöst] Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
worker777
Beiträge: 103
Registriert: 14.04.2015 07:59:26

[gelöst] Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von worker777 » 21.03.2021 10:03:02

Guten Morgen Community,

habe ein Bash-Script, welches Funktionsaufrufe nutzt und dabei Zugriff auf globale Variablen hat.
Schematisch sieht es in etwa so aus:

Code: Alles auswählen

Globale_Variable=''

funktion_a()
{
	Globale_Variable="$Globale_Variable, $1"
}

funktion_b()
{
	... code ...
	funktion_a("ZusatzString")
	... code ...
	
	echo '1'  # ReturnWert
}

# 'main':
... code ...
Result=$(funktion_b)
echo "$Globale_Variable"
Kurz in Worten nochmals:
Ich möchte vom 'main'-Code aus 'funktion_b' aufrufen, und diese ruft dann die 'funktion_a' auf.

Problem:
Der [neue] Inhalt der 'Globale_Variable' wird zwar in 'funktion_a' zugeordnet (festgestellt in 'funktion_a' durch: echo "$Globale_Variable" >> ./test.text), kommt aber im 'main'-Code nicht an - soll heissen, die Variable 'Globale_Variable' hat die Zuordnung, die un 'funktion_a' geschieht nicht (oder wenn's der erste Aufruf war, ist sie leer).

Ich habe den verdacht (da $uchmaschine nix ausgespuckt hat), dass es mit dem Aufruf '$(funktion_b)' im 'main'-Code zu tun hat. Aber ich brauche den ReturnWert von 'funktion_b'.

Wie kommt es zu solch einem seltsamen Verhalten und wie könnte ich es lösen?

Grüsse
worker
Zuletzt geändert von worker777 am 21.03.2021 13:03:58, insgesamt 1-mal geändert.

Benutzeravatar
MegaV0lt
Beiträge: 173
Registriert: 21.11.2011 11:16:07
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von MegaV0lt » 21.03.2021 10:26:02

So wird eine Funktion in Bash nicht aufgerufen

Code: Alles auswählen

	funktion_a("ZusatzString")
Parameter sollten so übergeben werden

Code: Alles auswählen

	funktion_a "ZusatzString"
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.

worker777
Beiträge: 103
Registriert: 14.04.2015 07:59:26

Re: Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von worker777 » 21.03.2021 10:28:47

MegaV0lt hat geschrieben: ↑ zum Beitrag ↑
21.03.2021 10:26:02
So wird eine Funktion in Bash nicht aufgerufen

Code: Alles auswählen

	funktion_a("ZusatzString")
Parameter sollten so übergeben werden

Code: Alles auswählen

	funktion_a "ZusatzString"
Stimmt, mein Fehler - aber nur hier im Beispiel/Skitze ;-)
Im Script ist es schon so, wie Du hier schreibst.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von heinz » 21.03.2021 10:59:13

Hallo worker777,

ich Denke, dass Problem ist der Aufruf:
Result=$(funktion_b)
Dadurch werden Deine Funktionen in einer Subshell ausgefuehrt.
Das bedeutet, sie bekommen eine Kopie der Variable Globale_Variable und bearbeiten dann diese anstatt das "Original".

Ich wuerde Voeschlagen, es vlt. eher so zu loesen:

Code: Alles auswählen

Globale_Variable=''

funktion_a()
{
	Globale_Variable="$Globale_Variable, $1"
}

funktion_b()
{
	... code ...
	funktion_a "ZusatzString"
	... code ...
	
	return 1  # ReturnWert
}

# 'main':
... code ...
funktion_b
Result=$?
echo "$Globale_Variable"
Das Funktioniert allerdings nur richtig, wenn funktion_b nur Zahlen im Bereich von 0-255 zurueckgeben moechte.

Gruss,
heinz

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von tobo » 21.03.2021 11:13:14

Alternativ für "egal, was man zurückgeben will" eine globale Variable. Per se sind die nämlich erstmal alle global:

Code: Alles auswählen

Globale_Variable=''

funktion_a()
{
	Globale_Variable="$Globale_Variable, $1"
}

funktion_b()
{
	... code ...
	funktion_a("ZusatzString")
	... code ...
	
	my_result='1'  # ReturnWert
}

# 'main':
... code ...
funktion_b
echo "$Globale_Variable"
echo "$my_result"

worker777
Beiträge: 103
Registriert: 14.04.2015 07:59:26

Re: Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von worker777 » 21.03.2021 13:03:31

heinz hat geschrieben: ich Denke, dass Problem ist der Aufruf:
Result=$(funktion_b)
Dadurch werden Deine Funktionen in einer Subshell ausgefuehrt.
Ja, das habe ich mir gedacht...
heinz hat geschrieben: Das bedeutet, sie bekommen eine Kopie der Variable Globale_Variable und bearbeiten dann diese anstatt das "Original".
Aaah, ja!
heinz hat geschrieben: Ich wuerde Voeschlagen, es vlt. eher so zu loesen:

Code: Alles auswählen

...
funktion_b()
{
	... code ...
	funktion_a "ZusatzString"
	... code ...
	
	return 1  # ReturnWert
}

# 'main':
... code ...
funktion_b
Result=$?
echo "$Globale_Variable"
Das Funktioniert allerdings nur richtig, wenn funktion_b nur Zahlen im Bereich von 0-255 zurueckgeben moechte.
... und abgesehen davon ist es "perfekt"! :D
Herzlichen Dank!
tobo hat geschrieben: Alternativ für "egal, was man zurückgeben will" eine globale Variable. Per se sind die nämlich erstmal alle global
Huh? Das wusste ich garnicht. Dachte die globalen Variablen muss man grundsätzlich ausserhalb von Funktionen definieren/initialisieren?
Auf jeden Fall danke für den Tipp & das Beispiel.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: [gelöst] Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von heinz » 21.03.2021 13:13:59

worker777 hat geschrieben: ↑ zum Beitrag ↑
21.03.2021 13:03:31
Dachte die globalen Variablen muss man grundsätzlich ausserhalb von Funktionen definieren/initialisieren?
Auf jeden Fall danke für den Tipp & das Beispiel.
Wie tobo schon geschrieben hat sind Variablen erstmal Global, egal wo sie erzeugt (erstes mal benutzt) werden.
Du kannst allerdings in Funktionen auch lokale Variablen nutzen, z.B. so:

Code: Alles auswählen

function Meine_tolle_funktion
{
  local lokale_variable  noch_eine  und_eine_initialisierte="wasauchimmer"

 ..code..
}
In dem Zusammenhang vlt. ebenfalls Interessant:

Code: Alles auswählen

help declare
Gruss,
heinz

worker777
Beiträge: 103
Registriert: 14.04.2015 07:59:26

Re: [gelöst] Bash-Script: Funktion aus Funktion mit Parameterübergabe aufrufen

Beitrag von worker777 » 21.03.2021 14:02:44

@heinz:
Alles klar, danke :THX:

Antworten