Variable nach While-Schleife nicht mehr gefüllt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tsibi
Beiträge: 269
Registriert: 31.08.2004 20:16:35
Wohnort: Oberfranken
Kontaktdaten:

Variable nach While-Schleife nicht mehr gefüllt

Beitrag von tsibi » 02.12.2009 07:48:33

Hallo zusammen,

wenn ich das folgende Script ausführe, ist die Variable nach dem Schleifendurchlauf leer. Warum? Ich kann mir das nicht erklären.

Code: Alles auswählen

#!/usr/bin/sh

message="--> "

echo "Das
Huhn
gackert" |

while read line
do
  message="$message$line "
  echo $message
done

echo ""
echo $message

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Variable nach While-Schleife nicht mehr gefüllt

Beitrag von Duff » 02.12.2009 08:47:20

Also bei mir ist die Variable message nach der while-Schleife nicht mehr leer.

Die Variable hat nach der while-Schleife noch den Anfangswert "-->".

Ausserhalb der while-Schleife müsste die Variable global sein. Inerhalb der Schleife ist dann wohl nur noch lokal, so dass nach dem Verlassen der Schleife wieder auf die globale zurück gegriffen wird.
Oh, yeah!

chrisbra
Beiträge: 122
Registriert: 19.10.2005 09:36:09
Wohnort: Sachsen-Anhalt
Kontaktdaten:

Re: Variable nach While-Schleife nicht mehr gefüllt

Beitrag von chrisbra » 02.12.2009 08:52:35

tsibi hat geschrieben:Hallo zusammen,

wenn ich das folgende Script ausführe, ist die Variable nach dem Schleifendurchlauf leer. Warum? Ich kann mir das nicht erklären.

Code: Alles auswählen

#!/usr/bin/sh

message="--> "

echo "Das
Huhn
gackert" |

while read line
do
  message="$message$line "
  echo $message
done

echo ""
echo $message
Pipe bedeutet Subshell und damit einen extra Prozess. Du kannst natürlich die Variable in dem neuen Prozess ändern, aber es ist nun mal nicht möglich, das Environment des aufrufenden Prozesses zu ändern.

Es gibt wohl einige Shells, die das "richtig" machen, so dass das rauskommt, was erwartet wird. zsh und ksh scheinen das so zu machen. Bei bash mußt du die Pipe eliminieren, z.B. so:

Code: Alles auswählen

~$ foo="blah"
~$ while read line ; do foo="$foo $line"; echo $foo; done <<EOF
> echo eins zwei drei
> EOF
blah echo eins zwei drei
~$ echo $foo
blah echo eins zwei drei
Meine Whishlist
:wq!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Variable nach While-Schleife nicht mehr gefüllt

Beitrag von Meillo » 02.12.2009 12:11:17

Use ed once in a while!

Antworten