wer mag mir verraten wie man das richtig macht
Code: Alles auswählen
$ VAR1=(Teil1 Teil2)
$ VAR2=VAR1
$ echo ${!VAR2[0]}
Teil1
$ echo ${!VAR2[1]}
$
Code: Alles auswählen
$ VAR3=${VAR2}[1]
$ echo ${!VAR3}
Teil2
Code: Alles auswählen
$ VAR1=(Teil1 Teil2)
$ VAR2=VAR1
$ echo ${!VAR2[0]}
Teil1
$ echo ${!VAR2[1]}
$
Code: Alles auswählen
$ VAR3=${VAR2}[1]
$ echo ${!VAR3}
Teil2
Code: Alles auswählen
VAR1=(Teil1 Teil2)
declare -n REF=VAR1
echo ${REF[0]}
echo ${REF[1]}
Code: Alles auswählen
declare -n REF=VAR1
Wieso verstehe ich davon ca. 80% wenn ich ein "umfassendes Handuch" durchgelesen habe?ThorstenS hat geschrieben:Ich hab dir mal ein Beispielprogramm nach nopaste geschoben, welches ich mir mal geschrieben habe, um die „neuen“ bash arrays zu verstehen, die mit der bash4 Einzug hielten. Ich benutze declare -A für die Arraydefinition.
38277
Kannst du mir mehr über Variablennamen-Referenzen sagen?newdeb hat geschrieben:Variablennamen-Referenzen (declare-Option -n), relativ neues Feature in der Bash (ab 4.3)
http://wiki.bash-hackers.org/scripting/bashchanges
Übernommen von der ksh93, ebenso wie die assoziativen Arrays (declare-Option -A).
Referenzierung bedeutet allgemein Zugriff auf den Variableninhalt (also nicht den Variablennamen) mit der bekannten $-Syntax.Inkodiktus hat geschrieben: Das Wort hat für mich eher nur die Bedeutung, dass es den Namen bei der Referenzierung sozusagen für andere "sperrt", ist das richtig?
Code: Alles auswählen
$ VAR=foo
$ typeset NOREF=VAR
$ typeset -n REF=VAR
$ echo $NOREF
VAR
$ echo $REF
foo
Das mit "-i" kann ich ja noch völlig verstehen.smutbert hat geschrieben:Mit declare oder typeset setzt man ein Attribut der Variablen. Mit -i zum Beispiel, dass Integer-Attribut, dh der Wert der Variable ist dann eine ganze Zahl. Oft oder meistens muss man keinen Typ/kein Attribut angeben, aber wie man an den Codezeilen meines Eröffnungspostes und den Lösungen von newdeb und Thorsten sieht, ist keinesfalls immer egal.
Namenreferenzen sind bequem, wenn man sowohl den Variablennamen als auch den Variableninhalt benötigt, z.B. zur Ausgabe.Inkodiktus hat geschrieben:Oder ist das -n noch viel mehr, gibts da besondere Einsatzmöglichkeiten, die ich nicht kenne?
Code: Alles auswählen
$ printenv() { local -n ref=$1; echo $1=$ref; }
$
$ printenv LANG
LANG=de_DE.UTF-8
$ printenv SHELL
SHELL=/bin/bash
$ printenv TERM
TERM=xterm
Code: Alles auswählen
$ VAR=LANG
$ eval echo \$$VAR
de_DE.UTF-8
Code: Alles auswählen
#!/bin/bash
declare -a DATA
DATA=(['Feld1']="Wert1" ['Feld2']="Inhalt")
MEMO[1]=$DATA
echo "Anzahl: ${#MEMO[@]}"
DATA=(['Feld1']="Wert G" ['Feld2']="Inhalt R")
MEMO[2]=$DATA
echo "Anzahl: ${#MEMO[@]}"
#=================================
# Auslesen
#=================================
echo "Eintrag: ${MEMO[2]}"
Code: Alles auswählen
#!/bin/bash
declare -A DATA
DATA=(['Feld1']="Wert G" ['Feld2']="Inhalt R")
echo "Eintrag2, Feld1: ${DATA['Feld1']}"
echo "Eintrag2, Feld2: ${DATA['Feld2']}"