arrays in der bash

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

arrays in der bash

Beitrag von smutbert » 03.02.2015 22:27:31

Hi,

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]}

$
dass der vorletzte Befehl funktioniert kann doch gewissermaßen nur Zufall sein ([0] wird ignoriert) und ich vermute ich müsste der Shell irgendwie sagen, dass das VAR2 und [x] "zusammengehören", aber ich finde keinen Weg das zu tun, außer dem Umweg über eine dritte Variable:

Code: Alles auswählen

$ VAR3=${VAR2}[1]
$ echo ${!VAR3}
Teil2

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: arrays in der bash

Beitrag von newdeb » 04.02.2015 00:33:10

Code: Alles auswählen

VAR1=(Teil1 Teil2)
declare -n REF=VAR1
echo ${REF[0]}
echo ${REF[1]}

Benutzeravatar
Inkodiktus
Beiträge: 702
Registriert: 15.08.2013 01:15:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: » host@user╺─╸[~]

Re: arrays in der bash

Beitrag von Inkodiktus » 04.02.2015 03:23:46

Hallo, wenn ich mal eine kleine Erregung der inneren Gehirnbahnen verursachen darf :mrgreen:

Was heißt nun das ganz genau, Herr Professor? ;)

Code: Alles auswählen

declare -n REF=VAR1
Habe ein ganzes verfluchtes Shell is the Hell Buch gelesen und da steht nix von "-n" :(

Viele Grüße

PS" Sorry, bin grad super drauf :) "
Meine Sprachkenntnisse: nur deutsch
Mein Laptop: http://www.asus.com/Notebooks_Ultrabook ... ifications
Mein Debian: Stable + OpenBox
Mein Editor: Emacs
Meine Devise: Frei bleiben - so lange wie es geht : -)

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: arrays in der bash

Beitrag von ThorstenS » 04.02.2015 07:53:45

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.
NoPaste-Eintrag38277

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: arrays in der bash

Beitrag von smutbert » 04.02.2015 08:10:51

Danke!

Benutzeravatar
Inkodiktus
Beiträge: 702
Registriert: 15.08.2013 01:15:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: » host@user╺─╸[~]

Re: arrays in der bash

Beitrag von Inkodiktus » 04.02.2015 08:27:18

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.
NoPaste-Eintrag38277
Wieso verstehe ich davon ca. 80% wenn ich ein "umfassendes Handuch" durchgelesen habe? :evil:

@Thorsten: Tipp von mir, wenn man schon den Nick angibt und Datum, wo bleibt das Copyright?

Habt ihr vielleicht ein Tipp für ein aktuelles Buch für mich?
Danke!

Grüße
Meine Sprachkenntnisse: nur deutsch
Mein Laptop: http://www.asus.com/Notebooks_Ultrabook ... ifications
Mein Debian: Stable + OpenBox
Mein Editor: Emacs
Meine Devise: Frei bleiben - so lange wie es geht : -)

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: arrays in der bash

Beitrag von ThorstenS » 04.02.2015 08:57:50

schau mal hier - dort findest du jede Menge hilfreiche Tipps:
http://www.thegeekstuff.com/2010/06/bas ... -tutorial/

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: arrays in der bash

Beitrag von newdeb » 04.02.2015 09:06:29

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).

Benutzeravatar
Inkodiktus
Beiträge: 702
Registriert: 15.08.2013 01:15:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: » host@user╺─╸[~]

Re: arrays in der bash

Beitrag von Inkodiktus » 04.02.2015 09:16:36

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).
Kannst du mir mehr über Variablennamen-Referenzen sagen?
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?
Meine Sprachkenntnisse: nur deutsch
Mein Laptop: http://www.asus.com/Notebooks_Ultrabook ... ifications
Mein Debian: Stable + OpenBox
Mein Editor: Emacs
Meine Devise: Frei bleiben - so lange wie es geht : -)

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: arrays in der bash

Beitrag von newdeb » 04.02.2015 09:32:43

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?
Referenzierung bedeutet allgemein Zugriff auf den Variableninhalt (also nicht den Variablennamen) mit der bekannten $-Syntax.
Die Namenreferenzen bewirken sozusagen eine zweistufige Referenzierung oder Indirektion, d.h. einen Zugriff auf den Inhalt (Stufe 2) derjenigen Variablen, die der Refererzvariablen zugewiesen wurde (Stufe 1). Das kann man sich bildlich als Referenzkette vorstellen (REF -> VAR -> $VAR)
Beispiel:

Code: Alles auswählen

$ VAR=foo
$ typeset NOREF=VAR
$ typeset -n REF=VAR
$ echo $NOREF
VAR
$ echo $REF
foo
Indirektion wird parallel in der Bash mittels der Syntax ${!VAR} unterstützt, nur für Arrayelemente m.W. nicht in dieser Form.

Benutzeravatar
Inkodiktus
Beiträge: 702
Registriert: 15.08.2013 01:15:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: » host@user╺─╸[~]

Re: arrays in der bash

Beitrag von Inkodiktus » 04.02.2015 13:25:26

Okay, ich versuch das mal zu erklären

typeset -n REF=VAR
ist nichts anderes als das?
REF=$VAR
???

Wenn ja, wozu dann das Ganze?
Oder ist das -n noch viel mehr, gibts da besondere Einsatzmöglichkeiten, die ich nicht kenne?

Danke für die Mühe! :THX:
Meine Sprachkenntnisse: nur deutsch
Mein Laptop: http://www.asus.com/Notebooks_Ultrabook ... ifications
Mein Debian: Stable + OpenBox
Mein Editor: Emacs
Meine Devise: Frei bleiben - so lange wie es geht : -)

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: arrays in der bash

Beitrag von smutbert » 04.02.2015 16:45:37

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.

Benutzeravatar
Inkodiktus
Beiträge: 702
Registriert: 15.08.2013 01:15:35
Lizenz eigener Beiträge: GNU General Public License
Wohnort: » host@user╺─╸[~]

Re: arrays in der bash

Beitrag von Inkodiktus » 04.02.2015 18:12:03

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.
Das mit "-i" kann ich ja noch völlig verstehen.
Meine Sprachkenntnisse: nur deutsch
Mein Laptop: http://www.asus.com/Notebooks_Ultrabook ... ifications
Mein Debian: Stable + OpenBox
Mein Editor: Emacs
Meine Devise: Frei bleiben - so lange wie es geht : -)

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: arrays in der bash

Beitrag von smutbert » 04.02.2015 19:43:07

-n sagt ganz ähnlich, dass der Wert dieser Variable nur der Name einer weiteren Variablen ist, was newdeb ja bereits unter dem Namen zweistufige Referenzierung oder Indirektion so schön erklärt hat.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: arrays in der bash

Beitrag von newdeb » 04.02.2015 21:58:56

Inkodiktus hat geschrieben:Oder ist das -n noch viel mehr, gibts da besondere Einsatzmöglichkeiten, die ich nicht kenne?
Namenreferenzen sind bequem, wenn man sowohl den Variablennamen als auch den Variableninhalt benötigt, z.B. zur Ausgabe.
Z.B. könnte man eine kleine Shellfuntion definieren, die Umgebungsvariablen ausgibt:

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
Früher hat man für diesen Zweck das unsichere "eval" mit etwas obskurer Syntax verwendet:

Code: Alles auswählen

$ VAR=LANG
$ eval echo \$$VAR
de_DE.UTF-8

s837ubc
Beiträge: 133
Registriert: 23.07.2013 14:17:01

Re: arrays in der bash

Beitrag von s837ubc » 09.02.2015 14:11:56

Hallo,

im Zusammenhang mit Arrays und Subarrays komme ich irgendwie nicht weiter.

Im Script soll ein Array in einem anderen Array gespeichert werden, damit diese später wieder ausgelesen werden können:

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]}"
Man kann zwar alle Einträge des Arrays DATA im Array MEMO speichern, aber das Auslesen funktioniert noch nicht so wie gewünscht.

Kann mir jemand einen Tip geben?

uname
Beiträge: 12072
Registriert: 03.06.2008 09:33:02

Re: arrays in der bash

Beitrag von uname » 09.02.2015 15:14:16

Dein Beispiel ist bereits zu komplex. Du willst ja Arrays in Arrays packen und diese dann einfach irgendwie wieder ausgeben. Ich habe mal dein Problem minimiert. Ich habe nur den zweiten Eintrag genommen.

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']}"
Anzumerken ist folgendes:
Es funktioniert nur mit großem A bei "declare". Keine Ahnung warum.
Und außerdem erwartet das System für den Array die Laufvariable. Hier als "Feld1" bzw. "Feld2".

Ob man Arrays in Arrays einsetzen kann weiß ich leider auch nicht. Wie man den Array im gesamten ausgibt weiß ich auch nicht. Meistens will man aber auf Felder zugreifen, denn sonst könnte man ja auch gleich einfache Strings verwenden.

Antworten