View previous topic :: View next topic |
Author |
Message |
musv Advocate
Joined: 01 Dec 2002 Posts: 3337 Location: de
|
Posted: Thu Nov 13, 2014 12:36 pm Post subject: [solved] Mehrdimensionales Array in Bash |
|
|
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 |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2545 Location: Konradsreuth (Germany)
|
Posted: Thu Nov 13, 2014 7:10 pm Post subject: |
|
|
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 |
|
|
musv Advocate
Joined: 01 Dec 2002 Posts: 3337 Location: de
|
Posted: Fri Nov 14, 2014 11:34 am Post subject: |
|
|
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 |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6747
|
Posted: Fri Nov 14, 2014 1:41 pm Post subject: |
|
|
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 |
|
|
l3u Advocate
Joined: 26 Jan 2005 Posts: 2545 Location: Konradsreuth (Germany)
|
Posted: Fri Nov 14, 2014 3:53 pm Post subject: |
|
|
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 |
|
|
Hilefoks l33t
Joined: 29 Jan 2003 Posts: 849 Location: Emden / Deutschland
|
Posted: Sat Nov 15, 2014 2:08 pm Post subject: |
|
|
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 |
|
|
musv Advocate
Joined: 01 Dec 2002 Posts: 3337 Location: de
|
Posted: Mon Nov 17, 2014 9:29 am Post subject: |
|
|
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 |
|
|
mv Watchman
Joined: 20 Apr 2005 Posts: 6747
|
Posted: Mon Nov 17, 2014 2:44 pm Post subject: |
|
|
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 |
|
|
|