ubuntuusers.de

Aus einer Funktion eine weitere Funktion aufrufen

Status: Gelöst | Ubuntu-Version: Kubuntu 11.10 (Oneiric Ocelot)
Antworten |

newbie

Anmeldungsdatum:
23. März 2006

Beiträge: 965

Hi,

folgendes kleines Beispiel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Demonstriert die Verwendung von Parametern
# Name: afunc18

# Globale Variable
var="ich bin global"

# Funktion localtest
localtest() {
local var="ich bin local"
alocaltest
}

#Funktion alocaltest
alocaltest() {
echo $var
}

# Hauptfunktion
localtest

Warum wird echo $var in der Funktion alocaltest nicht ausgeführt? Ich rufe die Funktion localtest auf und dort rufe ich ja eine weitere Funktion auf → alocaltest. Ich habe deshalb erwartet, dass ich als Ausgabe 2x "ich bin local" erhalte und nicht 1x.

Danke!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Newbie,

Dein kleines Beispiel habe ich mal um die Trace-Funktion und einige symbolische Markierungen ergänzt:

#!/bin/bash
set -x

# Demonstriert die Verwendung von Parametern
# Name: afunc18

# Globale Variable
var="ich bin global"

# Funktion localtest
localtest() {
__="localtest beginnt"
local var="ich bin local"
alocaltest
__="localtest endet"
}

#Funktion alocaltest
alocaltest() {
___="alocaltest beginnt"
echo $var
___="alocaltest endet"
}

# Hauptfunktion
_="main beginnt"
localtest
_="main endet"

Bei der Version siehst Du, warum alocaltest nur 1x aufgerufen wird und auch nur 1x "ich bin local" gedruckt wird.
(sonst druckt ja niemand)

LG und ein gesegnetes Weihnachtsfest,

track

newbie

(Themenstarter)

Anmeldungsdatum:
23. März 2006

Beiträge: 965

Hi, ich kann leider deine Antwort nicht verstehen. Ich weiß weder was Trace-Funktion ist noch was symbolische Markierungen bedeuten.

Ich habe dein Script ausgeführt, aber ich verstehe die Ausgabe nicht. Heißt das Debuggin, was du da machst? Im Buch, was ich lese, kommt das später - bin noch nicht so weit.

Außerdem steht in dem Buch folgendes zu diesem Beispiel: "Rufen Sie aus einer Funktion eine weitere Funktion auf, steht dieser Funktion ebenfalls die lokale Variable zur Verfügung". Also müsste die Funktion alocaltest die lokale Variable var kennen und ausgeben können - was jedoch nicht funktioniert.

EDIT: Gerade gemerkt, dass die Funktion localtest kein echo hat, deshalb wird "ich bin local" nur ein mal ausgegeben. Also funktioniert alles richtig. Danke.

So war das gedacht:

1
2
3
4
5
6
7
...
localtest() {
local var="ich bin local"
echo $var
alocaltest
}
...

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

newbie schrieb:

Es wäre einfacher, wenn du angeben würdest, um welche Sprache es sich handelt. Ich gehe mal von Bash aus.

Warum wird echo $var in der Funktion alocaltest nicht ausgeführt? Ich rufe die Funktion localtest auf und dort rufe ich ja eine weitere Funktion auf → alocaltest. Ich habe deshalb erwartet, dass ich als Ausgabe 2x "ich bin local" erhalte und nicht 1x.

Wie kommst du auf 2x? echo wird nur einmal, in alocaltest aufgerufen, das nur einmal von localtest aufgerufen wird. Und localtest wird nur einmal im Hauptprogramm aufgerufen - also wird auch echo nur einmal aufgerufen und du bekommst nur eine Ausgabe.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

newbie schrieb:

Hi, ich kann leider deine Antwort nicht verstehen. Ich weiß weder was Trace-Funktion ist noch was symbolische Markierungen bedeuten.

Die Zeilen mit dem + an Anfang ist die Trace-Wiedergabe der Shell: sie zeigt einfach den jeweils aktuellen Befehl nochmal, unmittelbar bevor sie ihn ausführt. Mehr "Zauber" ist das gar nicht.
Ich wollte die Schachtelung der einzelnen Funktionen zeigen, und da ist mir nichts besseres eingefallen ...

Als symbolische Markierungen habe ich Variablen-Zuweisungen missbraucht, praktisch als Kommentare. (Normale Kommentare werden ja nicht angezeigt. Die Unterstriche sind hier Variablennamen, eigentlich nur wegen der Optik so gewählt)

EDIT: Gerade gemerkt, dass die Funktion localtest kein echo hat, deshalb wird "ich bin local" nur ein mal ausgegeben. Also funktioniert alles richtig. Danke.

Genau das war der Punkt !

LG,

track

Antworten |