Ich habe einen Trick zum Implementieren von assoziativen Arrays in einem Shell-Skript gesehen. Zum Beispiel print array["apples"]
könnte geschrieben werden, echo \$array$key
wo key = Äpfel.
Es wurde jedoch nicht erwähnt, wie die Schlüssel generiert werden sollen, um über das Array zu iterieren. Die einzige Möglichkeit, die ich mir vorstellen konnte, bestand darin, die Schlüssel in einer durch Leerzeichen getrennten Variablen zu speichern, damit ich eine for-Schleife verwenden konnte, um über das Array zu iterieren.
Gibt es eine andere Möglichkeit, die Schlüssel für die spätere Verwendung aufzubewahren?
shell-script
associative-array
Egghead
quelle
quelle
Antworten:
Shells mit assoziativen Arrays
Einige moderne Shells bieten assoziative Arrays: ksh93, bash ≥4, zsh. Wenn
a
es sich in ksh93 und bash um ein assoziatives Array handelt,"${!a[@]}"
handelt es sich um das Array seiner Schlüssel:In zsh funktioniert diese Syntax nur im ksh-Emulationsmodus. Andernfalls müssen Sie die native Syntax von zsh verwenden:
${(k)a}
funktioniert auch, wenna
kein leerer Schlüssel vorhanden ist.In zsh können Sie auch gleichzeitig
k
Eys undv
Alues durchlaufen:Shells ohne assoziative Arrays
Das Emulieren von assoziativen Arrays in Shells, die sie nicht haben, ist viel mehr Arbeit. Wenn Sie assoziative Arrays benötigen, ist es wahrscheinlich an der Zeit, ein größeres Tool wie ksh93 oder Perl einzuführen.
Wenn Sie assoziative Arrays in einer reinen POSIX-Shell benötigen, können Sie diese auf folgende Weise simulieren, wenn die Schlüssel nur die Zeichen
0-9A-Z_a-z
(ASCII-Ziffern, Buchstaben und Unterstriche) enthalten. Unter dieser Annahme können Schlüssel als Teil von Variablennamen verwendet werden. Die folgenden Funktionen wirken auf ein Array, das durch ein Namenspräfix, den „Stamm“, gekennzeichnet ist, der keine zwei aufeinander folgenden Unterstriche enthalten darf.(Warnung, nicht getesteter Code. Fehlererkennung für syntaktisch ungültige Stämme und Schlüssel wird nicht bereitgestellt.)
quelle
Ich bin nicht sicher, was Sie unter "speichern" verstehen, aber Sie können die Schlüssel mithilfe der folgenden
${!array[@]}
Syntax durchlaufen :Also, um zu wiederholen:
Ich habe hier ein schönes, kurzes Tutorial dazu gefunden .
Wie in den Kommentaren unten ausgeführt, wurden in
bash
Version 4 assoziative Arrays hinzugefügt . Hier finden Sie einen Artikel in einem Linux-Journal zu diesem Thema.quelle
(bash version 4 only)
Das ist wichtig zu beachten. Traditionell sindbash
Arrays nur numerisch.typeset
stattdeclare
in Ihren Beispielen verwenden. Das würde sie zwischen bash 4 und ksh93 portabel machen, die zuerst Shell-assoziative Arrays implementierten.Shells ohne assoziative Arrays
Es ist nicht so schwer, wenn die Tasten auf
[0-9A-Za-z_]
(Zahlen, Buchstaben, Unterstrich) beschränkt sind.Der Trick besteht darin, anstatt in Array [ $ key ] zu speichern, in Variablen array_ $ key zu speichern .
Einstellen:
Erhalten:
Hinweis: Werte dürfen nicht enthalten
'
(einfaches Anführungszeichen).quelle
Das funktioniert in Bash
ODER
Keine Notwendigkeit, eval afaik zu verwenden
quelle