Variable nach Schleife nicht mehr sichtbar?

05/11/2009 - 21:52 von Bernd Hohmann | Report spam
Ich werde alt... sowas funktionierte doch sonst so schön?

#!/bin/bash
tmp="hallo welt"
ps aux | grep "/dev/" | while read line; do
tmp="$tmp $line"
# echo "tmp= $tmp"
done
echo "tmp= $tmp"

Ausgabe des Programms ist "tmp= Hallo Welt", wenn man den Kommentar
entfernt sieht man aber, dass die Variable "tmp" ordentlich gefüllt war.

Hmpf?

Bernd

Visit http://www.nixwill.de and http://www.spammichvoll.de
jean.oliver@nixwill.de & bernado.bernhardi@spammichvoll.de
 

Lesen sie die antworten

#1 Ernest Herder
05/11/2009 - 22:33 | Warnen spam
Bernd Hohmann wrote:

#!/bin/bash
tmp="hallo welt"
ps aux | grep "/dev/" | while read line; do
tmp="$tmp $line"
# echo "tmp= $tmp"
done
echo "tmp= $tmp"



Das hàngt von der Shell ab.
Manche Shells belegen eine temporàre Variable innerhalb der Loop.
Die pdksh z. B. macht das so.
Die echte KSH auf Linux macht das - soweit ich weiss - nicht.
Offensichtlich verwendet auch die Bash eine temporàre Variable, die bei
Beendigung der Loop verschwindet.
Dieses Verhalten finde ich etwas làstig.
Ich habe aber noch keine zufriedenstellende Lösung dafür gefunden.
Meist kann man aber mit einem Würgaround leben.

Hier ein paar Beispiele:

Wenn z. B. nur der Wert des letzten Durchlaufs interessiert kann
man so vorgehen:
#!/bin/bash
tmp="hallo welt"
tmp="$tmp $(ps aux|while read line;do echo "xx $line";done|tail -1)"
echo "tmp= $tmp"

Wenn es nur darum geht, alle Zeilen aneinanderzuhàngen (mit
Blanks getrennt) geht das so:
#!/bin/bash
tmp=$(ps aux|tr '' ' ')
echo "$tmp"

Wenn alle Zeilen hintereinandergehàngt werden sollen und der
Trenner soll beliebig sein geht das z. B. so:
#!/bin/bash
tmp=$(ps aux|sed -e 's/$/!DAS IST DER TRENNER!/'|tr -d '')
echo "$tmp"

Ernest

Ähnliche fragen