PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : globale Variblen in Schleifen...



robert
08-04-2017, 01:19
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:


#!/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

rais
18-04-2017, 21:07
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:


#!/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

robert
19-04-2017, 13:50
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.

rais
19-04-2017, 16:08
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