Variable aus einer Funktion abrufen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von satriani, 19.01.2013.

  1. #1 satriani, 19.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    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.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bitmuncher, 19.01.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    Du kannst die Variable global machen, indem du sie ausserhalb der Funktionen deklarierst.
     
  4. #3 satriani, 20.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    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.
     
  5. #4 bitmuncher, 20.01.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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.
     
  6. #5 satriani, 20.01.2013
    Zuletzt bearbeitet: 20.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    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
     
  7. #6 Spröde, 20.01.2013
    Zuletzt bearbeitet: 20.01.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    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
    
    
     
  8. #7 satriani, 20.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    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.

    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.
     
  9. #8 satriani, 21.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    ich weß leider nicht mehr weiter. Anscheinend bin ich an die Genze des machbaren unter Shell-Funktion gelangt :(
     
  10. #9 Spröde, 21.01.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Ich check Dein Problem nicht. Wenn Du die Funktion "Funk_mail" aus Deinem letzten Code aufrufst, werden die Varis global gesetzt und korrekt ausgegeben.
     
  11. #10 satriani, 21.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    Ich check es ehrlich gesagt auch nicht, ich werde den Skript nochmal durchgehen. Irgendwas stimmt hier nicht.
     
  12. #11 tgruene, 21.01.2013
    tgruene

    tgruene Routinier

    Dabei seit:
    02.02.2012
    Beiträge:
    418
    Zustimmungen:
    0
    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$ 
    
     
  13. #12 Spröde, 21.01.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    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:
     
  14. #13 satriani, 21.01.2013
    Zuletzt bearbeitet: 21.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    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ß.
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Spröde, 22.01.2013
    Zuletzt bearbeitet: 22.01.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    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
    
     
  17. #15 satriani, 28.01.2013
    satriani

    satriani SysLion

    Dabei seit:
    20.04.2011
    Beiträge:
    39
    Zustimmungen:
    0
    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.
     
Thema:

Variable aus einer Funktion abrufen

Die Seite wird geladen...

Variable aus einer Funktion abrufen - Ähnliche Themen

  1. Wie komme ich an den Inhalt des Inhalts einer Variable?

    Wie komme ich an den Inhalt des Inhalts einer Variable?: Hallo Zusammen, ich möchte meine Buildumgebung vereinfachen und besser zu automatisieren. Ein Skript schreibt Pfade in die env und diese...
  2. Teil einer Variablen auslesen und in neue Variable schreiben

    Teil einer Variablen auslesen und in neue Variable schreiben: Hallo, ist für Euch bestimmt ganz einfach, aber trotz googlen komme ich nicht auf eine Lösung. In Variable x habe ich stehen: xy,ab Nun möchte...
  3. Dateiname einer Befehlsausgabe als Variable festlegen

    Dateiname einer Befehlsausgabe als Variable festlegen: Hallo zusammen, ich suche mit pdfgrep -H -R 1528/12/11 *nach einem bestimmten Ausdruck. Ausgabe ist z.B.: ---------- 305448.pdf:Mein...
  4. Inhalt einer Variablen aus Batch an Shellscript übergeben

    Inhalt einer Variablen aus Batch an Shellscript übergeben: Hallo, ich komme einfach nicht drauf. Wie kann ich den Wert aus einer Variablen eines Batches an mein Shellscript übergeben? So? #...
  5. Inhalt einer Variable als Programmaufruf starten

    Inhalt einer Variable als Programmaufruf starten: Also, ich möchte gerne ein Shell-Script schreiben, das je nach Usereingabe ein Anderes Shell-Script (bzw. Programm) aufruft und dann den...