Hallo Gruppe,
ich habe in einer Datei z.b. Folgendes:
klasse=("eins" "zwei") eins=("klaus" "gerd") zwei=("emil" "inge")
Diese Datei binden ich mittels source in ein bas-Skript ein und möchte gern den zweiten Schüler der ersten Klasse wissen:
${${!${klasse[0]}}[1]} geht nicht aber:
${klasse[0]} liefert doch "eins"
${!text} referenziert auf eine Variable "text"
Was mache ich falsch / wie geht es richtig? Es soll in eine doppelte while Schleife eingebaut werden um alle Schüler zu bekommen.
Mit freundlichen Grüßen / Kind regards Ronny Seffner
Ronny Seffner ronny@seffner.de (Do 25 Okt 2012 13:50:27 CEST):
Hallo Gruppe,
ich habe in einer Datei z.b. Folgendes:
klasse=("eins" "zwei") eins=("klaus" "gerd") zwei=("emil" "inge")
Diese Datei binden ich mittels source in ein bas-Skript ein und möchte gern den zweiten Schüler der ersten Klasse wissen:
${${!${klasse[0]}}[1]} geht nicht aber:
Bin mir nicht sicher, ob das was wird, die Bash ist mit Substitutionen in Substitutionen nicht ganz so gut. Und übersichtlich ist es dann auch nicht.
Ich würde da eine andere Scriptsprache nehmen.
${klasse[0]} liefert doch "eins"
${!text} referenziert auf eine Variable "text"
Nein, auf eine Variable, deren Name in der Variablen "text" steht.
${${!${klasse[0]}}[1]} geht nicht aber:
Bin mir nicht sicher, ob das was wird, die Bash ist mit Substitutionen in Substitutionen nicht ganz so gut. Und übersichtlich ist es dann auch nicht.
Das habe ich auch gemerkt. Obige Konstrukte quittiert die bash mit "falsche variablenersetzung", einfachere enthalten dann kein array sondern nur den ersten Wert. Jetzt ist aber mein Ehrgeiz gepackt, wenn es mit einem Wert klappt, warum dann nicht mit einem Array - man könnte doch in einem Zwischenschritt das Array einer lokalen Variable zuweisen um nicht verschachtelte Substitutionen zu haben. Nur gelöst habe ich das noch nicht ;-(
Könnte eval helfen?
Ich würde da eine andere Scriptsprache nehmen.
Warum wusste ich nur, dass diese Antwort kommen wird? Wahrscheinlich, weil die mir nicht gefällt ;-)
${!text} referenziert auf eine Variable "text"
Nein, auf eine Variable, deren Name in der Variablen "text" steht.
Sorry, das wollte ich doch sagen.
Mit freundlichen Grüßen / Kind regards Ronny Seffner
Hallo Ronny,
On Thu, Oct 25, 2012 at 13:50:27 +0200, Ronny Seffner wrote:
ich habe in einer Datei z.b. Folgendes:
klasse=("eins" "zwei") eins=("klaus" "gerd") zwei=("emil" "inge")
${${!${klasse[0]}}[1]} geht nicht aber:
Sowas geht wahrscheinlich nur mit "eval" und ein wenig Quotinghoelle:
eval echo ${${klasse[0]}[1]}
Mit eval wird das, was sich nach einer Shell-Expansion ergibt, ein weiteres mal durch die Shell expandiert. Deshalb auch das gequotete $-Zeichen vor dem ersten Klammerpaar.
Als geschachtelte while-Schleifen:
#!/bin/bash
klasse=("eins" "zwei" "gummizelle") eins=("klaus" "gerd") zwei=("emil" "inge") gummizelle=("sarah palin" "patent-troll" "tepco")
k=0 while [ -n "${klasse[$k]}" ] do echo "Klasse ${klasse[$k]}:" s=0 eval sn=${${klasse[$k]}[$s]} while [ -n "$sn" ] do echo " $sn" s=$[s+1] eval sn=${${klasse[$k]}[$s]} done k=$[k+1] done
Gruss, Chris
lug-dd@mailman.schlittermann.de