Variable oder Array nach Schleifendurchlauf

E

elwood

Grünschnabel
Hallo zusammen,
ich hab vor einiger Zeit ein Skript geschrieben (unter AIX), dass aus einer Datei Werte ausliest und in zwei Arrays schreibt.
Das selbe Skript läuft nun unter Linux (SuSe) nicht mehr. Das Array ist innerhalb der Schleife gefüllt, sobald die Schleife komplett durchlaufen wurde, ist das Array leer.

Code:
i=0
cat /var/temp/datei.txt | while read line
do
      myArr[$i]=`echo $line | awk 'BEGIN{FS=":"}{print $2}'`
      i=`expr $i + 1`
    #Debugausgaben
      echo "Counter $i"      
      echo $i                    #Funktioniert
      echo "Arrayinhalt:"
      echo ${myArr[$i]}     #Funktioniert
done      #Schleifenende

echo $i                 # $i ist jetzt leer
echo ${myArr[0]}  # Das Array ist jetzt auch leer

Ich muss doch in einer Schleife eine Variable oder ein Array füllen können, um damit nachher weiter zu arbeiten.
Kann mir da jemand helfen?

gruß
elwood
 
Hallo elwood,
diese Beobachtung habe ich auch schon so gemacht:
Daraufhin habe ich mich vom Konstrukt
Code:
cat /var/temp/datei.txt | while read line
do
:
done
verabschiedet und folgenden umständlichen weg benutzt:
Code:
lines=`cat file | wc -l`
for z in `seq 1 $lines`; do
     line=`sed -n ${z}p file `
     for s in `seq 1 9` ; do
          eval array_${z}_${s}=`echo $line | cut -f$s m-d" " `
     done
done
Dann kann man außerhalb der for-Schleifen auf das Array zugreifen.
Ist vielleicht nicht besonders elegant, funktionierte aber bei meinem
Textfile mit 9 Spalten gut.
Habe aber keine Ahnung, warum das mit der while-Schleife nicht geht.
Vielleicht kann das mal jemand erklären ?

Hoffe, es hilft !
hmh
 
Danke hmhweb,
das probier ich mal aus.
Ich hab inzwischen auch ein bisschen rumgebastelt und dabei ist mir auch aufgefallen, dass das Problem bei for-Schleifen nicht auftritt.
Muss wohl wirklich an dem "while read line"-Konstrukt liegen.
Wie gesagt unter AIX hats funktioniert.
Vielleicht hat ja wirklich jemand eine Lösung. Wäre echt gut.

gruß
bjoern
 
read liest von stdin
cat ...|... ist ein kommando das nicht in der shell direckt läuft deßhalb sind die Variablen danach auch leer
lass doch alles inder shell direct laufen z.b:
Code:
i=0
{while read line
do
      myArr[$i]=`echo $line | awk 'BEGIN{FS=":"}{print $2}'`

    #Debugausgaben
      echo "Counter $i"       #Funktioniert
      echo "Arrayinhalt:"${myArr[$i]}     #Funktioniert
      i=`expr $i + 1`
done      #Schleifenende
}< /var/temp/datei.txt
echo $i                 # $i ist jetzt nicht mehr leer
echo ${myArr[0]}  # Das Array ist jetzt auch nicht leer

gruss bernd
Registrierter Linux User: #291395 bei http://counter.li.org
 
Code:
... 
     myArr[$i]=`echo $line | awk 'BEGIN{FS=":"}{print $2}'`
      i=`expr $i + 1`
    #Debugausgaben
      echo "Counter $i"      
      echo $i                    #Funktioniert
      echo "Arrayinhalt:"
      echo ${myArr[$i]}     #Funktioniert
...

ich bezweifle, dass die Ausgabe von ${myArr[$i]} funktioniert, jedenfalls nicht bei der Reihenfolge :devil:
 
Hallo

Um einen Dateiinhalt *zeilenweise in ein Array zu bekommen , geht es recht einfach. Das sollte mit bash und ksh gehen.
*zeilenweise: Meint, dass jedes Element eine komplette Zeile enthält.
Code:
#Testfile erzeugen mit Leerzeichen pro Zeile.
$ for i in {1..30}; do echo "Zeile $i">>test; done
#Array fuellen
$ A=($(cat test));
$ echo Das Array hat ${#A[*]} Elemente
das Array hat 30 Elemente

#Alles einzeln abarbeiten
for Element in "${A[*]}"; do
echo $ELEMENT;
done
Zeile 1
Zeile 2
Zeile 3
Zeile 4
Zeile 5
Zeile 6
Zeile 7
Zeile 8
Zeile 9
Zeile 10
Zeile 11
Zeile 12
Zeile 13
Zeile 14
Zeile 15
Zeile 16
Zeile 17
Zeile 18
Zeile 19
Zeile 20
Zeile 21
Zeile 22
Zeile 23
Zeile 24
Zeile 25
Zeile 26
Zeile 27
Zeile 28
Zeile 29
Zeile 30
$ for i in $(seq 0 29); do 
A[$i]="Neue Zeile mit Index $i";
done
$ echo ${A[0]}
Neue Zeile mit Index 0
;)

Alles recht unkompliziert.

Gruß Wolfgang
 

Ähnliche Themen

Grafische Anzeige der Temperatur

HandbrakeCLI Shell Skript

Parameter einer Variable zuordnen

Last mit etc/passwd anzeigen lassen

bash: Fehlermeldung und Werte in Array sortieren?

Zurück
Oben