PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Globale Variable in gepipe'ter Schleife verändern?



qeldroma
05-11-2007, 16:45
Hallo zusammen,

wenn ich eine Schleife habe, die eine Subshell startet, was z.B. bei einer Pipe wohl der Fall ist (??), wird eine globale Variable leider nicht verändert.

Wie bekomme ich nun ein Schleifenergebnis aus der Schleife heraustransportiert?

Z.B.:

txt=0
ls -1 /var/log|while read line;do
txt="$line;$txt"
done
echo $txt

Ergebnis ist: 0 anstatt der aneinandergeketteten Dateinamen...

Grüße, Florian

jeebee
05-11-2007, 18:08
warum nicht einfach

txt=0
for line in /var/log/*
do
txt="$line;$txt"
done
echo $txt

jan61
05-11-2007, 19:41
warum nicht einfach

txt=0
for line in /var/log/*
do
txt="$line;$txt"
done
echo $txt

Vorsicht. Das geht nur in bestimmten Fällen gut:

jan@jack:~/tmp/leer> ll
insgesamt 0
-rw-r--r-- 1 jan users 0 2007-09-23 14:19 datei mit leerzeichen.txt
jan@jack:~/tmp/leer> for i in *; do
> echo "<$i>"
> done
<datei mit leerzeichen.txt>
jan@jack:~/tmp/leer> for i in `ls`; do echo "<$i>"; done
<datei>
<mit>
<leerzeichen.txt>
jan@jack:~/tmp/leer> echo "Text mit Leerzeichen" >datei\ mit\ leerzeichen.txt
jan@jack:~/tmp/leer> for i in `cat datei\ mit\ leerzeichen.txt`; do
> echo "<$i>"
> done
<Text>
<mit>
<Leerzeichen>
Für die unteren Fälle kann man z. B. mit IFS arbeiten, oder die while-Schleife so nutzen:

jan@jack:~/tmp/leer> f=`ls | while read i; do echo -n $i; done`
jan@jack:~/tmp/leer> echo $f
datei mit leerzeichen.txtdatei_ohne_leerzeichen.txt
Jan

qeldroma
06-11-2007, 11:53
Hallo zusammen,

ihr versteift euch auf das ls, aber das ist nicht meine Frage, sorry.

Ich will ganz allgemein wissen, wie ich das mache! Dieses "ls /var/log" steht nur als dummy für eine x-beliebige Eingabe...

Grüße, Florian

jan61
06-11-2007, 18:46
Hallo zusammen,

ihr versteift euch auf das ls, aber das ist nicht meine Frage, sorry.

Ich will ganz allgemein wissen, wie ich das mache! Dieses "ls /var/log" steht nur als dummy für eine x-beliebige Eingabe...

Grüße, Florian

Das ls in meinem unteren Code-Schnipsel steht auch für eine x-beliebige Eingabe, genau wie die for-Bedingung bei jeebee und die Beispiele, die ich für die Gefahren von leerzeichenbehafteten Eingaben in einer for-Schleife hergenommen habe.

Ich dachte, es wäre klar geworden: Entweder auf eine Pipe (und damit Subshell) verzichten oder die in der Subshell ermittelten Werte per stdout nach oben durchreichen.

Jan

qeldroma
07-11-2007, 15:34
verdammt, ich habe meinen Fehler:

data="$(mysql ...... -e 'select name from users')"
for i in $data;do
echo $id
done

Ergebnis war eine Leerzeile...warum nur ;)

So ein Mist, ich danke euch vielmals für die Mühe :o

Grüße, Florian