# [solved] Mehrdimensionales Array in Bash

## musv

Hallo, 

ich brauch mal etwas Bashhilfe.

Was will ich realisieren:

```
INDIZES=('ab' 'cd' 'ef' 'gh')

ab=('blubb' 'blah')

cd=('heute' 'nacht')

ef=('essen' 'schlafen')

gh=('apfelmus' 'torte')
```

Ich kann jetzt die Elemente der Arrays abfragen mit: 

```
echo ${INDIZES[0]}

ab
```

Ich würde jetzt gern die Arrays multidimensional abfragen können. Also sowas in der Art:

```
echo ${${INDIZES[1]}[0]}

-> heute
```

Irgendwie steh ich da auf dem Schlauch. Geht sowas?Last edited by musv on Mon Nov 17, 2014 9:34 am; edited 1 time in total

----------

## l3u

Ich hab vor längerer Zeit auch mal sowas probieren wollen. Bash an sich kann das nicht. Ich hab da was auf stackoverflow gefunden: http://stackoverflow.com/questions/11233825/multi-dimensional-arrays-in-bash

 *Quote:*   

> Bash does not support neither multidimensional arrays, neither hashes, and it seems that you want a hash that values are arrays. This solution is not very beautiful, a solution with an xml file should be better :
> 
> ```
> array=('d1=(v1 v2 v3)' 'd2=(v1 v2 v3)')
> 
> ...

 

Vielleicht hilft's?

----------

## musv

Hab's anders gelöst. 

Es gibt mittlerweile assoziative Arrays in der Bash. Und anstatt das Array multidimensional zu definieren, erledige ich das durch einen Trenner. 

Also so in der Art:

```

declare -A DATA

INDIZES=('ab' 'cd' 'ef' 'gh')

DATA[ab]="blubb:blah"

DATA[cd]="heute:nacht"

DATA[ef]="essen:schlafen"

DATA[gh]="apfelmus:torte"

for i in ${INDIZES[@]}; do 

   BLUBB=${DATA[$i]}

   IFS=':' read a ARR <<< "$BLUBB"

   # Zugriff

   echo ${ARR[1]}

done

```

Das ist mir dann übersichtlich genug, um es auch noch in Zukunft leicht abändern zu können.

----------

## mv

Wenn Du wirklich mehrdimensionale Arrays brauchst, hast Du mit an Sicherheit grenzender Wahrscheinlichkeit die falsche Programmiersprache gewählt:

Dein Projekt ist dann so komplex, dass perl, python, ... geeignetere Sprachen sind.

Anonsten geht natürlihc prinzipiell alles mit eval.

Etwa in Deinem ersten Beispiel 

```
eval echo \${${INDIZES[1]}[0]}
```

Gibt es nicht sogar Bashismen zur Variablenindirektion?

----------

## l3u

 *mv wrote:*   

> Wenn Du wirklich mehrdimensionale Arrays brauchst, hast Du mit an Sicherheit grenzender Wahrscheinlichkeit die falsche Programmiersprache gewählt

 

Das lag mir auch schon auf der Zunge ;-)

----------

## Hilefoks

 *l3u wrote:*   

>  *mv wrote:*   Wenn Du wirklich mehrdimensionale Arrays brauchst, hast Du mit an Sicherheit grenzender Wahrscheinlichkeit die falsche Programmiersprache gewählt 
> 
> Das lag mir auch schon auf der Zunge 

 

Spontan würde ich dem beipflichten. 

Allerdings habe ich in den letzten 3 Monaten ganz interessante Erfahrungen mit der Bash als Programmiersprache gemacht. @Work hatten wir die Anforderung, ein kleines Buildsystem und einen Installer für ein Embedded-Linux zu schreiben. Ich hatte mich für die Bash entschieden, da insbesondere auf dem Embedded-Linux diese bereits vorhanden war. Python, Perl und Co. waren nicht erlaubt (zu groß für das Zielsystem), C, C++, etc. erschienen mir wenig geeignet für ein Programm, das im Wesentlichen nur externe Befehle ausführt.

Heute ist unser Bash-"Script" ein ausgewachsenes Programm. Es kann nun durch "Plugins" erweitert werden, alle wichtigen Funktionen stecken in wiederverwendbare Bibliotheken, es gibt einen Mechanismus zur "Mehrfachvererbung", unser Package-Format ist mehr oder weniger ein Subset des ebuild Formats und, last but not least, unser Programm enthält einen kompletten Webserver.

Hätte ich die Bash genommen, wenn ich gleich alle Anforderungen gekannt hätte - ganz klar nein. Andererseits gab es aber bisher nichts, das mit der Bash nicht möglich war.

MfG,

Hilefoks

----------

## musv

 *mv wrote:*   

> Anonsten geht natürlihc prinzipiell alles mit eval.
> 
> Etwa in Deinem ersten Beispiel 
> 
> ```
> ...

 

Vielen Dank. Ist gut zu wissen. Auf die Syntax wär ich nie gekommen.

Welche Bedeutung hat der Backslash (Escape) an dieser Stelle?

----------

## mv

 *musv wrote:*   

>  *mv wrote:*   Anonsten geht natürlihc prinzipiell alles mit eval.
> 
> Etwa in Deinem ersten Beispiel 
> 
> ```
> ...

 

Das ist ganz normales Quoting. Wenn Du statt "eval" ein "echo" schreibst, siehst Du exakt, welches Kommando ausgeführt wird:

 *bash wrote:*   

> > INDIZES=(ab ac)
> 
> > echo echo \${${INDIZES[1]}[0]}
> 
> echo ${ab[0]}

 

Man hätte auch irgendwie anders quoten können, etwa so:

```
eval echo '${'"${INDIZES[1]}"'[0]}'
```

(Auch hier: Anstelle des "eval" ein "echo" zeigt, was passiert)

----------

