Forums

Skip to content

Advanced search
  • Quick links
    • Unanswered topics
    • Active topics
    • Search
  • FAQ
  • Login
  • Register
  • Board index International Gentoo Users Deutsches Forum (German) Diskussionsforum
  • Search

[solved] Mehrdimensionales Array in Bash

Unterhaltung über Gentoo und andere Themen: Alles was nicht in ein Support-Forum gehört.
Post Reply
  • Print view
Advanced search
8 posts • Page 1 of 1
Author
Message
musv
Advocate
Advocate
User avatar
Posts: 3380
Joined: Sun Dec 01, 2002 4:13 pm
Location: de

[solved] Mehrdimensionales Array in Bash

  • Quote

Post by musv » Thu Nov 13, 2014 12:36 pm

Hallo,

ich brauch mal etwas Bashhilfe.

Was will ich realisieren:

Code: Select all

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: Select all

echo ${INDIZES[0]}
ab
Ich würde jetzt gern die Arrays multidimensional abfragen können. Also sowas in der Art:

Code: Select all

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.
Top
l3u
Advocate
Advocate
User avatar
Posts: 2619
Joined: Wed Jan 26, 2005 3:12 pm
Location: Konradsreuth (Germany)
Contact:
Contact l3u
Website

  • Quote

Post by l3u » Thu Nov 13, 2014 7:10 pm

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/1123 ... ys-in-bash
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: Select all

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?
Top
musv
Advocate
Advocate
User avatar
Posts: 3380
Joined: Sun Dec 01, 2002 4:13 pm
Location: de

  • Quote

Post by musv » Fri Nov 14, 2014 11:34 am

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: Select all

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.
Top
mv
Watchman
Watchman
User avatar
Posts: 6795
Joined: Wed Apr 20, 2005 12:12 pm

  • Quote

Post by mv » Fri Nov 14, 2014 1:41 pm

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: Select all

eval echo \${${INDIZES[1]}[0]}
Gibt es nicht sogar Bashismen zur Variablenindirektion?
Top
l3u
Advocate
Advocate
User avatar
Posts: 2619
Joined: Wed Jan 26, 2005 3:12 pm
Location: Konradsreuth (Germany)
Contact:
Contact l3u
Website

  • Quote

Post by l3u » Fri Nov 14, 2014 3:53 pm

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 ;-)
Top
Hilefoks
l33t
l33t
Posts: 849
Joined: Wed Jan 29, 2003 12:16 pm
Location: Emden / Deutschland
Contact:
Contact Hilefoks
Website

  • Quote

Post by Hilefoks » Sat Nov 15, 2014 2:08 pm

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. -
Top
musv
Advocate
Advocate
User avatar
Posts: 3380
Joined: Sun Dec 01, 2002 4:13 pm
Location: de

  • Quote

Post by musv » Mon Nov 17, 2014 9:29 am

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

Code: Select all

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?
Top
mv
Watchman
Watchman
User avatar
Posts: 6795
Joined: Wed Apr 20, 2005 12:12 pm

  • Quote

Post by mv » Mon Nov 17, 2014 2:44 pm

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

Code: Select all

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: Select all

eval echo '${'"${INDIZES[1]}"'[0]}'
(Auch hier: Anstelle des "eval" ein "echo" zeigt, was passiert)
Top
Post Reply
  • Print view

8 posts • Page 1 of 1

Return to “Diskussionsforum”

Jump to
  • Assistance
  • ↳   News & Announcements
  • ↳   Frequently Asked Questions
  • ↳   Installing Gentoo
  • ↳   Multimedia
  • ↳   Desktop Environments
  • ↳   Networking & Security
  • ↳   Kernel & Hardware
  • ↳   Portage & Programming
  • ↳   Gamers & Players
  • ↳   Other Things Gentoo
  • ↳   Unsupported Software
  • Discussion & Documentation
  • ↳   Documentation, Tips & Tricks
  • ↳   Gentoo Chat
  • ↳   Gentoo Forums Feedback
  • ↳   Duplicate Threads
  • International Gentoo Users
  • ↳   中文 (Chinese)
  • ↳   Dutch
  • ↳   Finnish
  • ↳   French
  • ↳   Deutsches Forum (German)
  • ↳   Diskussionsforum
  • ↳   Deutsche Dokumentation
  • ↳   Greek
  • ↳   Forum italiano (Italian)
  • ↳   Forum di discussione italiano
  • ↳   Risorse italiane (documentazione e tools)
  • ↳   Polskie forum (Polish)
  • ↳   Instalacja i sprzęt
  • ↳   Polish OTW
  • ↳   Portuguese
  • ↳   Documentação, Ferramentas e Dicas
  • ↳   Russian
  • ↳   Scandinavian
  • ↳   Spanish
  • ↳   Other Languages
  • Architectures & Platforms
  • ↳   Gentoo on ARM
  • ↳   Gentoo on PPC
  • ↳   Gentoo on Sparc
  • ↳   Gentoo on Alternative Architectures
  • ↳   Gentoo on AMD64
  • ↳   Gentoo for Mac OS X (Portage for Mac OS X)
  • Board index
  • All times are UTC
  • Delete cookies

© 2001–2026 Gentoo Foundation, Inc.

Powered by phpBB® Forum Software © phpBB Limited

Privacy Policy

 

 

magic