Hallo Liste, mag sein das das Thema OT ist, aber mein Problem besteht auf einem Suse 10.0 System ... Ich brauch einen Hinweis wo ich weiterlesen kann, weil mir keine sinnvollen begriffe einfallen nach denen ich suchen / googlen könnte. Hier ein Beispiel wie das Problem aussieht: (in einer Konsole; passiert aber auch innerhalb von bash-scripten) rma@wasser:~> test=geht rma@wasser:~> echo $test geht rma@wasser:~> echo "nicht" | while read wort; do test="$test _${wort}_"; echo $test; done geht _nicht_ rma@wasser:~> echo $test geht DerVariablen test wird Anfangs etwas zugewiesen ("geht") dann in der while-schleife noch etwas angehängt ("_nicht_"). Am Ende der Schleife wird wie erwartet "geht _nicht_" ausgegeben! Nach der Schleife ergibt ein "echo $test " aber wieder "geht". Was passiert da? Wie kann ich nach der Schleife den Inhalt der in der Schleife veränderten Variablen bekommen. Mir wäre hier ein "geht _nicht_" wirklich lieber (auch wenn sich das jetzt komisch liest). Vielen Dank schon mal für alle Hinweise -- MfG Rolf Masfelder EMail: rolf.masfelder@nector.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
On Friday 16 June 2006 14:05, Rolf Masfelder wrote:
rma@wasser:~> test=geht rma@wasser:~> echo $test geht rma@wasser:~> echo "nicht" | while read wort; do test="$test _${wort}_"; echo $test; done geht _nicht_ rma@wasser:~> echo $test geht
DerVariablen test wird Anfangs etwas zugewiesen ("geht") dann in der while-schleife noch etwas angehängt ("_nicht_"). Am Ende der Schleife wird wie erwartet "geht _nicht_" ausgegeben!
Nach der Schleife ergibt ein "echo $test " aber wieder "geht".
Was passiert da?
Ich vermute, dass hängt damit zusammen, dass die pipe eine Sub-Shell öffnet. (Das Thema gab es hier vor kurzen in einem ganz anderen Zusammenhang. Siehe "Shellscript-Problem: /bin/sh Funktion while return" von Harry Rüter.) Innerhalb der Sub-Shell ist zwar die Variable der Mutter-Shell bekannt, aber verändern kannst Du daran nichts.
Wie kann ich nach der Schleife den Inhalt der in der Schleife veränderten Variablen bekommen.
Christian Boltz hat dazu ein Beispiel: http://www.cboltz.de/de/linux/bash/ Übrigens: Es ist immer eine gute Idee, Variablen _nicht_ test zu nennen, da test auch ein Kommando ist. Das kann ungewollte Nebenwirkungen haben. Gruß, Achim -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo Liste,
mag sein das das Thema OT ist, aber mein Problem besteht auf einem Suse 10.0 System ... ........................................ (in einer Konsole; passiert aber auch innerhalb von bash-scripten)
rma@wasser:~> test=geht rma@wasser:~> echo $test geht rma@wasser:~> echo "nicht" | while read wort; do test="$test _${wort}_"; echo $test; done geht _nicht_ rma@wasser:~> echo $test geht
Scheinen zwar alles buildin-Kommandos der bash zu sein, dürfte bei denen aber auch auftreten: Wenn Du in der shell ein Kommando aufrufst wird die Umgebung in einen neuen Speicherbereich kopiert (auch $test mit dem Inhalt geht); dann wird in diesem neuen Bereich etwas gemacht ($test verändert, jedoch die Kopie des $test in diesem !! Bereich) und abschließend (done) der errorlevel an die aufrufende shell zurückgegeben( alles hat geklappt) und dann bist Du wieder in der ursprünglichen Shell und da hat $test den Wert "geht". raku @rolf: Sorry für den Doppelpost -- "Feel free" – 10 GB Mailbox, 100 FreeSMS/Monat ... Jetzt GMX TopMail testen: http://www.gmx.net/de/go/topmail -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Am Friday 16 June 2006 14:05 schrieb Rolf Masfelder:
mag sein das das Thema OT ist, aber mein Problem besteht auf einem Suse 10.0 System ...
Ich brauch einen Hinweis wo ich weiterlesen kann, weil mir keine sinnvollen begriffe einfallen nach denen ich suchen / googlen könnte.
Hier ein Beispiel wie das Problem aussieht:
(in einer Konsole; passiert aber auch innerhalb von bash-scripten)
rma@wasser:~> test=geht rma@wasser:~> echo $test geht rma@wasser:~> echo "nicht" | while read wort; do test="$test _${wort}_"; echo $test; done geht _nicht_ rma@wasser:~> echo $test geht
DerVariablen test wird Anfangs etwas zugewiesen ("geht") dann in der while-schleife noch etwas angehängt ("_nicht_"). Am Ende der Schleife wird wie erwartet "geht _nicht_" ausgegeben!
Nach der Schleife ergibt ein "echo $test " aber wieder "geht".
Was passiert da?
Das "|" erzeugt eine SubShell. Dort hin werden zwar die Variablen als Kopie mitgenommen, aber veränderungen nicht mit zurück.
Wie kann ich nach der Schleife den Inhalt der in der Schleife veränderten Variablen bekommen. Mir wäre hier ein "geht _nicht_" wirklich lieber (auch wenn sich das jetzt komisch liest).
test=`echo "nicht" | while read wort; do test="$test _${wort}_"; echo $test; done` -- Andreas -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
Hallo, Am Freitag 16 Juni 2006 15:05 schrieb Andreas Winkelmann:
Am Friday 16 June 2006 14:05 schrieb Rolf Masfelder:
mag sein das das Thema OT ist, aber mein Problem besteht auf einem Suse 10.0 System ...
Ich brauch einen Hinweis wo ich weiterlesen kann, weil mir keine sinnvollen begriffe einfallen nach denen ich suchen / googlen könnte.
Hier ein Beispiel wie das Problem aussieht:
(in einer Konsole; passiert aber auch innerhalb von bash-scripten)
rma@wasser:~> test=geht rma@wasser:~> echo $test geht rma@wasser:~> echo "nicht" | while read wort; do test="$test _${wort}_"; echo $test; done geht _nicht_ rma@wasser:~> echo $test geht
DerVariablen test wird Anfangs etwas zugewiesen ("geht") dann in der while-schleife noch etwas angehängt ("_nicht_"). Am Ende der Schleife wird wie erwartet "geht _nicht_" ausgegeben!
Nach der Schleife ergibt ein "echo $test " aber wieder "geht".
Was passiert da?
Das "|" erzeugt eine SubShell. Dort hin werden zwar die Variablen als Kopie mitgenommen, aber veränderungen nicht mit zurück.
Die SubShell ist wohl die Quelle meiner Probleme ...:-(
Wie kann ich nach der Schleife den Inhalt der in der Schleife veränderten Variablen bekommen. Mir wäre hier ein "geht _nicht_" wirklich lieber (auch wenn sich das jetzt komisch liest).
test=`echo "nicht" | while read wort; do test="$test _${wort}_"; echo $test; done`
Das geht jetzt hier bei meinem Beispiel, das script an dem ich sitze ist aber einige Zeilen länger ... Ich weis jetzt aber wie ich weiter vorgehen muss.
-- Andreas
Danke für die Hinweise (auch an die Anderen, die mir geantwortet haben) -- MfG Rolf Masfelder EMail: rolf.masfelder@nector.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
participants (4)
-
Achim Schaefer
-
Andreas Winkelmann
-
Rainer Kulhanek
-
Rolf Masfelder