Variable aus einer Funktion abrufen

satriani

satriani

SysLion
Wie der Titel schon sagt, möchte ich eine Variable aus einer Funktion in einer anderen abrufen, zB.

Code:
funktion1() {
if [ blabla ]
  then
          var=1
   else
          var=0
fi
}

funktion2() {
......
    echo $var
}

Danke im Voraus.
 
Du kannst die Variable global machen, indem du sie ausserhalb der Funktionen deklarierst.
 
Danke für die Antwort bitmuncher,

das ist mir schon klar, aber dabei handel es sich um mehreren Funktionen. Das hätte ich besser formulieren müssen, sorry dafür.
Genauer gesagt versuche ich mehrer Funktionen zu erstellen, die jeweils eine mail senden wenn es einen Fehler innerhalb der Funktion gibt.
Doch ich muss es leider gestehen es gelingt mir nicht recht. Das ganze sieht bei mir folgendermaßen aus:

Code:
funktion_1() {
..........
if [ error ]
  then
          var=1
fi
}

funktion_2() {
..........
if [ error ]
  then
          var=1
fi
}

funktion_3() {
..........
if [ error ]
  then
          var=1
fi

function_mail
if [ "$var" = 1 ]
  then
         echo "$(funktion_3)" | mail -s Thema email@mail.com
fi

über Vorschläge bzw. Ratschläge würde mich sehr freuen.
 
Ich sehe da immer noch keine Deklaration der globalen Variablen. Schauen wir uns deinen Source mal an. Ich schreib mal ein paar Denkanstösse als Kommentare rein:

Code:
funktion_1() {
..........
if [ error ]
  then
          var=1 # lokale Variable in funktion_1()
fi
}

funktion_2() {
..........
if [ error ]
  then
          var=1 # lokale Variable in funktion_2()
fi
}

funktion_3() {
..........
if [ error ]
  then
          var=1 # lokale Variable in funktion_3()
fi

function_mail
if [ "$var" = 1 ] # Zuweisung eines Wertes für eine Variable, deren Scope hier beginnt
  then
         echo "$(funktion_3)" | mail -s Thema email@mail.com
fi

Also... nochmal überarbeiten und nicht vergessen die globalen Variablen ganz am Anfang des Skripts zu deklarieren, damit sie in den danach folgenden Funktionen auch zur Verfügung stehen.
 
Also... nochmal überarbeiten und nicht vergessen die globalen Variablen ganz am Anfang des Skripts zu deklarieren, damit sie in den danach folgenden Funktionen auch zur Verfügung stehen.
OK, globale Variable wie folgt gesetzt, doch kein erwünschtes Ergebnis.

Code:
[COLOR="#FF0000"][B]var=""[/B][/COLOR]
funktion_1() {
..........
if [ error ]
  then
          var=1 # lokale Variable in funktion_1()
fi
}

funktion_2() {
..........
if [ error ]
  then
          var=1 # lokale Variable in funktion_2()
fi
}

funktion_3() {
..........
if [ error ]
  then
          var=1 # lokale Variable in funktion_3()
fi

function_mail
if [ "$var" = 1 ] # Zuweisung eines Wertes für eine Variable, deren Scope hier beginnt
  then
         echo "$(funktion_3)" | mail -s Thema email@mail.com
fi

EDIT: Ich werde Morgen deinen Post noch einmal durchlesen, ich glaube meine Müdigkeit hindert mich es zu verstehen :D
 
Zuletzt bearbeitet:
Variablen, die innerhalb einer Funktion gesetzt werden, sind global, es sei denn, man benutzt das Builtin "local":
http://openbook.galileocomputing.de...hell_008_004.htm#RxxKap00800404004EB01F028172

Wo ist also das Problem? Natürlich muss die Funktion, die eine Vari setzt, erst mal aufgerufen werden um die Vari zu setzen. Oder man setzt die Vari schon mal ausserhalb.

Beispiel:
Code:
#!/bin/bash

Var="Aus Main"

Funk1(){
  Var="Aus Funk 1"
}

Funk2(){
  Var="Aus Funk 2"
}

Funk3(){
  Var="Aus Funk 3"
}

echo $Var

Funk1
echo $Var

Funk2
echo $Var

Funk3
echo $Var

Code:
~> Test
Aus Main
Aus Funk 1
Aus Funk 2
Aus Funk 3
 
Zuletzt bearbeitet:
Ich sehe da immer noch keine Deklaration der globalen Variablen. Schauen wir uns deinen Source mal an. Ich schreib mal ein paar Denkanstösse als Kommentare rein:
Aber die Variablen sind in jeweiligen Funktionen nicht lokal. Es kommen zwar paar lokale Vriablen in den Funktionen vor, aber die haben mMn. mit der speziellen Var. nichts zutun.

Variablen, die innerhalb einer Funktion gesetzt werden, sind global, es sei denn, man benutzt das Builtin "local":
http://openbook.galileocomputing.de...hell_008_004.htm#RxxKap00800404004EB01F028172

Wo ist also das Problem? Natürlich muss die Funktion, die eine Vari setzt, erst mal aufgerufen werden um die Vari zu setzen. Oder man setzt die Vari schon mal ausserhalb.

Beispiel:
Code:
#!/bin/bash

Var="Aus Main".....

Danke für die Antwort Spröde,

man muss bedenken, dass "echo $Var" sich auch innerhalb einer anderen Funktion Befindet. Etwa so:

Code:
#!/bin/bash

Var="Aus Main"

Funk1(){
  Var="Aus Funk 1"
}

Funk2(){
  Var="Aus Funk 2"
}

Funk3(){
  Var="Aus Funk 3"
}

Funk_mail() {
echo $Var

Funk1
echo $Var

Funk2
echo $Var

Funk3
echo $Var
}

diese letzte Funktion wird im Terminal angezeigt, alle anderen Funktionen haben andere Aufgaben.
 
ich weß leider nicht mehr weiter. Anscheinend bin ich an die Genze des machbaren unter Shell-Funktion gelangt :(
 
Ich check Dein Problem nicht. Wenn Du die Funktion "Funk_mail" aus Deinem letzten Code aufrufst, werden die Varis global gesetzt und korrekt ausgegeben.
 
Ich check es ehrlich gesagt auch nicht, ich werde den Skript nochmal durchgehen. Irgendwas stimmt hier nicht.
 
Funktioniert doch alles, Du musst Funk_mail nur noch aufrufen:
Code:
tg@slartibartfast:~/tmp$ cat test.sh 
#!/bin/bash

Var="Aus Main"

Funk1(){
  Var="Aus Funk 1"
}

Funk2(){
  Var="Aus Funk 2"
}

Funk3(){
  Var="Aus Funk 3"
}

Funk_mail() {
echo $Var

Funk1
echo $Var

Funk2
echo $Var

Funk3
echo $Var
}

Funk_mail
Code:
tg@slartibartfast:~/tmp$ bash test.sh 
Aus Main
Aus Funk 1
Aus Funk 2
Aus Funk 3
tg@slartibartfast:~/tmp$
 
Jau. Parameterübergabe und Kommando-Substitution funktionieren auch wie gewohnt:
Code:
#!/bin/bash

Add(){
  echo $(( $1 + $2 ))
}

echo "10 + 10 = $(Add 10 10)"

Vielleicht beschreibt Satriani mal, was er denn wirklich erreichen will. Mir dünkt, hier ist jemand mächtig auf dem Holzweg... :think:
 
Danke tgruene,

ich habe den Fehler gefunden, achtet genau auf meinen Source im drittrn Post
bei dem Aufruf der Variablen aus den funktionen steht nur die Variable, also:
function_mail
Code:
if [ "[B][COLOR="#FF0000"]$var[/COLOR][/B]" = 1 ]
  then
         echo "$(funktion_3)" | mail -s Thema email@mail.com
fi
dabei sollte die Funktion definiert werden, etwa so:
Code:
function_mail
if [ "[B][COLOR="#FF0000"]Funktion_1 && $var[/COLOR][/B]" = 1 ]
  then
         echo "$(funktion_3)" | mail -s Thema email@mail.com
fi

Doch es wird der gesamte Inhalt der Funktion_1 angezeigt, das möchte ich nicht. Mich interessiert nur das Ergebnis, ob es einen Fehler gibt oder nicht.

@Spröde,
wie bereits erwähnt, es gibt mehrere Funktionen mit eigenen Aufgaben. Die letzte funktion ist dafür da, um eine Email zu senden, wenn es in mindestens einer Funktionen einen Fehler gibt.
Also wenn var=1 irgendwo in den Funktionen vorkommt, dann Email senden.

Gruß.
 
Zuletzt bearbeitet:
dabei sollte die Funktion definiert werden, etwa so:
Code:
function_mail
if [ "[B][COLOR="#FF0000"]Funktion_1 && $var[/COLOR][/B]" = 1 ]
  then
         echo "$(funktion_3)" | mail -s Thema email@mail.com
fi
Einmal versuche ich es noch, dann ziehe ich mich bitterlich weinend zurück. :brav: :
Code:
function_mail(){
  # Erst die Funktion aufrufen, die $var setzt
  Funktion_1
  # Jetzt erst $var auswerten
  if [ "$var" = 1 ]
  then
    echo "$(funktion_3)" | mail -s Thema email@mail.com
  fi
}

Was wohl noch nötig ist anzumerken: Beachte Groß/Kleinschrift.

Ich würde übrigens nicht mit $var arbeiten, sondern die Funktionen mit einem Rückgabewert ausstatten (return n), der in Funktion_Mail ausgewertet wird. Also so:
Code:
#!/bin/bash

Funktion_1(){
  if [ BEDINGUNG ]
  then
    return 1
  else
    return 0
  fi
}

Funktion_Mail(){
  if ! Funktion_1
  then
    # Funktion_1 lieferte einen Rückgabewert ungleich Null
    echo "$(funktion_3)" | mail -s Thema email@mail.com
  fi
}

Funktion_Mail
 
Zuletzt bearbeitet:
Danke für deine Mühe Spröde,

das ist leider nicht so wie ich es mir vorgestellt habe. Wie gesagt jede Funktion hat eigene Aufgabe, wenn in einer der Funktionen eine Aufgabe nicht erfolgt ist, soll die mail Funktion beim Ablesen aller Funktionen nach Fehlern durchsuchen und eine Mail sende falls in mindestens einer der Funktionen ein Fehler gibt. Beim ersten Beispiel funktioniert es, zwar nur für Funktion_1, aber immerhin :) doch leider wird die ganze Funktion_1 ausgegeben. Uns interessiert aber nur ob es einen Fehler gibt oder nicht.
 

Ähnliche Themen

Returncode ($?) bei find immer "0" ?

If-Abfrage kommt nicht positiv zurück, obwohl Kriterium erfüllt

Switche abfragen über Script

Hilfe für ein shell script

NAS-Drive Mount in Bash-Script über crontab

Zurück
Oben