Anzeige:
Ergebnis 1 bis 4 von 4

Thema: globale Variblen in Schleifen...

  1. #1
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122

    Question globale Variblen in Schleifen...

    edit: Sorry, im Titel vergessen. Es geht um ein Bash Script.

    Hallo,

    obwohl ich mich schon sehr, sehr lange mit Bash Scripten auseinander setze, ist mir noch nie aufgefallen, dass es eine Einschränkung bei globalen Variablen in Schleifen gibt. Oder habe ich irgend etwas verpasst.

    Ein Beispiel:
    Code:
    #!/bin/bash
    SDir="/irgend/ein/verzeichnis"
    FoundCound=0
    find "$SDir" -type f -iname "*.txt" | while read -r FFile
      do
      IsText=$(grep -i "test" "$FFile")
      [ -n "$IsText" ] && FoundCount=$((FoundCount+1))
      echo -n -e "\t==> $FoundCount\r"
    done
    echo "Text gefunden in $FoundCount dateien."
    So und genau da klappt es nicht (mehr?). FoundCount wird innerhalb der Schleife sauber hoch gezählt, wenn etwas gefunden wird. Aber nach der Schleife ist es immer 0.
    Übersehe ich irgend etwas, oder warum ist der Wert nach der Schleife immer 0? Die Variable ist doch schon vor der Schleife definiert und zählt auch innerhalb der Schleife hoch.

    Gruß
    Robert
    Geändert von robert (08-04-2017 um 00:23 Uhr)

  2. #2
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.680
    Zitat Zitat von robert Beitrag anzeigen
    Die Variable ist doch schon vor der Schleife definiert und zählt auch innerhalb der Schleife hoch.
    nicht ganz, hier deklarierst Du "FoundCound" und arbeitest in der Schleife mit "FoundCount" (hat aber mit Deinem Problem nix zu tun)
    Es scheint mit der Verwendung von find ... | while read ... zusammenzuhängen -- wenn ich das auf for .. in umbaue, funktioniert das:
    Code:
    #!/bin/bash
    SDir="./test"
    FoundCount=0
    for FFile in `find "$SDir" -type f -iname "*.txt"`; do
      IsText=$(grep -i "test" "$FFile")
      [ -n "$IsText" ] && FoundCount=$(( FoundCount +1 ))
      echo -n -e "\t==> $FoundCount\r"
    done
    echo -e "\nText gefunden in $FoundCount dateien."
    (den \n im letzten echo hab ich ergänzt, damit der echo-Befehl aus der Schleife nicht gleich wieder überschrieben wird)

    VG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  3. #3
    Registrierter Benutzer
    Registriert seit
    13.04.1999
    Ort
    Rheinstetten
    Beiträge
    122
    Hallo,

    danke für den Hinweis. Ich werde es mal umbauen. Warum das mit der Pipe Version nicht funktioniert, ist mir auch nicht wirklich klar. Vielleicht liegt es am read?

    Das mit dem FoundCount war ein Tippfehler und nur hier als Beispiel. Im orig. ist es eine andere Variable und korrekt. ;-)

    Gruß
    Robert

    Nachtrag:
    Ich habe es in eine While-Schleife ohne Pipe (mit temp. Datei) gepackt. Das Problem liegt eindeutig an der Pipe. Die For-Schleife ist nicht so ideal für mich, da es sehr viel kleine Text-Dateien sind.
    Geändert von robert (19-04-2017 um 13:18 Uhr)

  4. #4
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.680
    schau mal nach bash+pipe+variable+scope in einer Suchmaschine Deines Vertrauens...Stichwort: Subshell

    Ich hab das Teil (mit dem for-Konstrukt) mal auf meinen TL-Ordner losgelassen, dort nach "*.sty" und darin nach "RequirePackage" suchen (und mir dabei auch gleich die Anzahl durchsuchter Dateien mit ausgeben) lassen.
    Das Ergebnis ist derzeit bei mir 2467 Treffer von 4464 durchsuchten Dateien.
    Wie viele Dateien durchforstest Du denn, dass es bei Dir mit dem for-Konstrukt eng wird?

    VG
    Rainer
    There's nothing a good whack with a hammer won't fix!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •