Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[solved] Mehrdimensionales Array in Bash
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3337
Location: de

PostPosted: Thu Nov 13, 2014 12:36 pm    Post subject: [solved] Mehrdimensionales Array in Bash Reply with quote

Hallo,

ich brauch mal etwas Bashhilfe.

Was will ich realisieren:

Code:
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:

Code:
echo ${INDIZES[0]}
ab


Ich würde jetzt gern die Arrays multidimensional abfragen können. Also sowas in der Art:
Code:
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
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2545
Location: Konradsreuth (Germany)

PostPosted: Thu Nov 13, 2014 7:10 pm    Post subject: Reply with quote

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 :
Code:
array=('d1=(v1 v2 v3)' 'd2=(v1 v2 v3)')
for elt in "${array[@]}";do eval $elt;done
echo "d1 ${#d1[@]} ${d1[@]}"
echo "d2 ${#d2[@]} ${d2[@]}"

Vielleicht hilft's?
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3337
Location: de

PostPosted: Fri Nov 14, 2014 11:34 am    Post subject: Reply with quote

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:

Code:

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.
Back to top
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6747

PostPosted: Fri Nov 14, 2014 1:41 pm    Post subject: Reply with quote

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
Code:
eval echo \${${INDIZES[1]}[0]}

Gibt es nicht sogar Bashismen zur Variablenindirektion?
Back to top
View user's profile Send private message
l3u
Advocate
Advocate


Joined: 26 Jan 2005
Posts: 2545
Location: Konradsreuth (Germany)

PostPosted: Fri Nov 14, 2014 3:53 pm    Post subject: Reply with quote

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 ;-)
Back to top
View user's profile Send private message
Hilefoks
l33t
l33t


Joined: 29 Jan 2003
Posts: 849
Location: Emden / Deutschland

PostPosted: Sat Nov 15, 2014 2:08 pm    Post subject: Reply with quote

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
_________________
- Der Computer rechnet vor allem damit, dass der Mensch denkt. -
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3337
Location: de

PostPosted: Mon Nov 17, 2014 9:29 am    Post subject: Reply with quote

mv wrote:
Anonsten geht natürlihc prinzipiell alles mit eval.
Etwa in Deinem ersten Beispiel
Code:
eval echo \${${INDIZES[1]}[0]}

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

Welche Bedeutung hat der Backslash (Escape) an dieser Stelle?
Back to top
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6747

PostPosted: Mon Nov 17, 2014 2:44 pm    Post subject: Reply with quote

musv wrote:
mv wrote:
Anonsten geht natürlihc prinzipiell alles mit eval.
Etwa in Deinem ersten Beispiel
Code:
eval echo \${${INDIZES[1]}[0]}

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

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

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:
Code:
eval echo '${'"${INDIZES[1]}"'[0]}'

(Auch hier: Anstelle des "eval" ein "echo" zeigt, was passiert)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum