PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Arrays in bash



netlinker
27-06-2005, 14:25
Hallo,

ich würde gern wissen, ob es möglich ist mehrstufige Arrays in einem Bash-Script zu verwenden?


Zur Zeit habe ich einen einstufigen Array (class_name[$counter]), der in einer Schleife gefüllt wird. Jetzt brauche ich aber eine zweite Instanz, bekommen dass aber nicht hin.

Weiss einer von euch, ob das überhaupt und wenn wie geht?
Sollte dann irgendwie so aussehen:
class_name[[$counter]$sub_count]


Vielleicht habt ihr ja nen Tip.

Thx Björn

netlinker
28-06-2005, 16:10
Hallo,

leider gibt's ja noch nichts zu meiner Anfrage.

Eigentlich würde mir auch ein einstufiger Array reichen, jedoch müsste ich dann den Variablen-Namen dynamisch Vergeben können.

Ich werde nicht mehr als 8 classen haben, für die ich aber die Werte in einem Array brauche. Problem hier ist halt, dass die Class_names dynamisch ausgelesen werden und dann dafür die Werte ermittelt werden.

Geht es den, dass der Variabelen-Name eine andere Variabele ist?

etwa so $class[$counter]="wert"

Komme hier leider nicht weiter, vielleicht habt ihr ja nen paar tips.

mfg Björn


Hier noch nen paar Sachen die ausprobiert habe.
# class=klasse1
# $class=(1 2 3)
bash: klasse1=(1 2 3): command not found
# declare -a $class=(1 2 3)
# declare -a $class[10]=111
bash: declare: klasse1: cannot assign to array variables in this way
# echo ${klasse1[@]}
1 2 3

zsb-ip03:/opt/ftp-saver/sonstiges # echo ${class[@]}
klasse1
# echo ${${class}[@]}
bash: ${${class}[@]}: bad substitution

netlinker
29-06-2005, 18:57
Hi,

so langsam bin ich jetzt verzweifelt :mad:

Ich habe es zwar jetzt hinbekommen den Variabelen-Name dynamisch zu vergeben, kann die Werte aber nicht auslesen.

variname="St$vari1" #Da vari1 nen integer
variwert=1666455657286

# Den array auslesen und mit neuen Wert neu schreiebn, da sonst alle Daten verloren werden
declare -a $variname='($(declare -p $variname | cut -d "(" -f2 | cut -d ")" -f1 | sed s/\"//g) [$counter]=$variwert)'

Das einzige bei dem ich nen Ausgabe bekamm.
# =1666455657286
echo $[$variname[$counter]]
8346438

Ich probiere gerade auch:

array=$(declare -p $variname) #Ganzer Array
declare -a St12121='([1]="1666455657286" [2]="1666455657286" [11]="1666455657286")'

last_value=$(echo ${array##*\[$counter-1\]=} | cut -d \" -f1)

nur hier klappt das $counter-1 oder $counter allein net. Wenn ich eine 1 oder 2 per Hand eintrage gehts, aber der Wert kommt ja aus ner Schleife :confused:

Hat vielleicht no jemand einen Tip??

Bye Björn

Hans-Georg Normann
29-06-2005, 20:08
Schauen wir einmal nach:

Arrays
Bash provides one-dimensional array variables.
Das erklärt doch einiges oder? Bei awk hast du das gleiche Problem.

Abhilfe würde z. B. Python schaffen.

Hans

shark
29-06-2005, 21:05
Leider kann man in bash/korn shell etc ... keine 2-dimentional arrays nutzen. Aber du kannst als element von eine array ein array haben. Ich weiss es nicht was du genau machen willst aber vielleicht hilft das :



root@ssh1:/tmp# xxx[1]=a
root@ssh1:/tmp# yyy[1]=${xxx[1]}
root@ssh1:/tmp# echo ${yyy[1]}
a



Gruss,
Shark

netlinker
07-07-2005, 21:43
Hi Danke für eure Hilfe.

Habe jetzt eine Lösung gefunden, mit der ich mein Problem lösen konnte.

Ich interpretiere jetzt einen Zweidimensionalen Array:

zweidim_array[zeile][spalte] =eindim_array[zeile*Spaltenanzahl+spalte] Vobei Spaltenanzahl die max. Spaltenanzahl ist.

Was auch geht ist, das der Name des Arrays dynamisch vergeben wird:

varname="irgendwas" # Varname deklarieren
eval $varname[$counter]="wert" # Wert in Array schreiben
eval echo \${$varname[$counter]} # Ausgabe Array Wert