Hallo Liste, beruflich bedingt bin ich gerade dabei, einen Haufen Skripte für die KSH so umzuschreiben, daß sie auch mit der bash laufen. Damit wollen wir hier einen eventuellen Umstieg auf Unix durch eine den Windoof Usern im Handling vertrautere Shell erleichtern. Dabei ist mir folgendes aufgefallen: Das folgende Skript liefert als Ergebnis_1 immer 0 und eine leere Variable und als Ergebnis_2 immer die Anzahl der Zeilen und die letzte Zeile der passwd (getestet unter einer bash 2.00.0(1) auf Sun und HP Maschinen). Mit einer KSH sind (wie eigentlich erwartet) die Ergebnisse die gleichen. Innerhalb der Schleife wird die Zählvariable in beiden Fällen sauber hochgezählt. Es scheint, das ein Konstrukt in der Art wie in der ersten Schleife alle (!) dort gesetzten Variablen wieder verloren hat, wenn die Schleife beendet ist. So wird die erste Schleife z.B. immer den Wert für i ausgeben, der vor der Schleife bestand. Mein Problem ist nicht, daß ich das nicht umgehen kann, aber ich möchte es gerne verstehen. Liegt das nur an meiner bash Version hier in der Firma oder ist das ein bug/feature? mfg Andreas PS: Ich weiß, daß ich die Zeilen auch anders zählen kann; es geht hier nur ums Prinzip der Schleife. ------------------- cut here --------------------------- #set -xv i=0 cat /etc/passwd|while read line do newline=$line (( i += 1 )) #echo $i, $newline done echo "Ergebnis 1: i=$i, newline=$newline" i=0 while read line do newline=$line (( i += 1 )) #echo $i, $newline done
Hi, On Fri, Mar 17, 2000 at 13:15 +0100, Kyek, Andreas, MDV-TBAx wrote:
Innerhalb der Schleife wird die Zählvariable in beiden Fällen sauber hochgezählt. Es scheint, das ein Konstrukt in der Art wie in der ersten Schleife alle (!) dort gesetzten Variablen wieder verloren hat, wenn die Schleife beendet ist. So wird die erste Schleife z.B. immer den Wert für i ausgeben, der vor der Schleife bestand. [...] #set -xv i=0 cat /etc/passwd|while read line do newline=$line (( i += 1 )) #echo $i, $newline done echo "Ergebnis 1: i=$i, newline=$newline"
Du liest den Inhalt von passwd mit einer Pipeline ein. Jedes Kommando in der Pipeline wird in einer eigenen Subshell ausgeführt, d.h. in diesem Fall auch die gesamte while - do - done Konstruktion. Alle Variablen die Du in der Subshell setzt oder veränderst, gehen beim Verlassen dieser natürlich verloren. Laut der Bash-Dokumentation ist das ein Feature: Each command in a pipeline is executed as a separate process (i.e., in a subshell). Ciao, Stefan --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
participants (2)
-
andreas.kyek@it-mannesmann.de
-
stefan.troeger@wirtschaft.tu-chemnitz.de