PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash-Problem mit "while read" ?



Robby-TX5
10-02-2006, 10:34
Hi

ich habe folgendes Problem:

Mein Script liest Informationen aus einer Datei, die anschließend weiter verarbeitet werden sollen. Um es simple zu machen, stehen in der Datei Name.txt die Namen "Klaus" und "Walter", die ausgelesen und unterschiedlich interpretiert werden.


#!/bin/bash
#
# testscript
#

admin_name="kein_Name_vorhanden"

cat name.txt | while read name
do
case ${name} in
Klaus) admin_name=${name}",_das_ist_gut" ;;
Walter) admin_name=${name}",_das_ist_sogar_noch_besser" ;;
esac
printf "Admin-Name = %s \n" ${admin_name}
done
printf "Letzter eingelesener Admin-Name = %s \n" ${admin_name}

exit 0

Die Ausgabe sieht dann so aus:


./testscript.sh
Admin-Name = Walter,_das_ist_sogar_noch_besser
Admin-Name = Klaus,_das_ist_gut
Letzter eingelesener Admin-Name = kein_Name_vorhanden


Obwohl die Schleifendurchläufe die Variable eindeutig verändern, besitzt die Variable am Ende den "alten" Urprungswert. D. h. auch, dass die While-Read-Schleife mit einer Kopie der Variablen arbeiten muss, welche aber nach am Ende der While-Schleife verloren geht.

Wie komme ich denn an die veränderte Kopie der Variablen auch ausserhalb der Schleife?

Thanks for helping.

PS.: In einer "for ..... do" Schleife existiert das Problem nicht.
PS.: Das Phänomen existiert auf Linux und AIX, mit verschiedene Kernel-Versionen ( 2.6.14.3, i386; 2.6.5-7.97-pseries64, AIX 5.1 ML5) mit der bash als auch mit der ksh. Witziger Weise gibt die ksh unter AIX (und nur unter AIX) das für mich richtige Ergebnis raus.

ninguno
10-02-2006, 11:02
wenn du's so machst gehts
while read name
do
...
done <name.txt

Robby-TX5
10-02-2006, 11:31
@ninguno

hey, danke.

Kannst Du mir auch noch den Unterschied erklären, wieso das bei Deiner Variante klappt und bei meiner nicht?

Danke

Robby-TX5

ninguno
10-02-2006, 11:40
du sendest die daten über eine pipe an deine while schleife, das heisst die ganze while schleife läuft in einem child prozess. die variable admin_name innerhalb der schleife ist eine andere (lokale) variable als admin_name ausserhalb derselben, die beiden heissen nur zufällig gleich.

Robby-TX5
10-02-2006, 12:42
@ninguno

hmm, das ist eine gute Erklärung. Da hätte man auch selbst drauf kommen können.

Gibt es eine Möglichkeit, die veränderte Variable aus dem Child-Prozess dem "Eltern"-Prozess zurückzugeben?

Robby

ninguno
10-02-2006, 13:26
direkt nicht, aber ein möglicher umweg wäre command substitution
admin_name="kein_Name_vorhanden"

admin_name=`cat name.txt | while read name
do
case ${name} in
Klaus) admin_name=${name}",_das_ist_gut" ;;
Walter) admin_name=${name}",_das_ist_sogar_noch_besser"
echo ${admin_name} ;;
esac
done`

printf "Letzter eingelesener Admin-Name = %s \n" ${admin_name}

Robby-TX5
10-02-2006, 14:50
ja, .... nee, ..... habe ich ausprobiert. :)

Damit werden alle Ausgaben innerhalb der Schleife der Variablen übergeben. Die Ausgabe lautet dann ....



Letzter eingelesener Admin-Name = Admin-Name = Walter,_das_ist_sogar_noch_besser Admin-Name = Klaus,_das_ist_gut

Naja egal, ich werde Deinen ersten Ansatz umsetzen.

Robby