Gibt es eine Möglichkeit, Schlüssel-Wert-Paare im Bash-Skript zu erstellen?


79

Ich versuche, ein Wörterbuch mit Schlüsselwertpaaren mithilfe des Bash-Skripts zu erstellen. Ich versuche diese Logik zu verwenden:

declare -d dictionary
defaults write "$dictionary" key -string "$value"

... wo $dictionaryist eine Variable, aber das funktioniert nicht.

Gibt es eine Möglichkeit, Schlüssel-Wert-Paare im Bash-Skript zu erstellen?


Ich habe an Bash gearbeitet. Ich habe mir einen Weg ausgedacht, dies selbst zu tun.
RKS

Die Verwendung dieser Funktion hilft auch: urls + = ('<dict> <key> key1 </ key> <string>' $ value1 '</ string> <key> key2 </ key> <string>' $ value2 '</ string > <key> key3 </ key> <string> '$ value3' </ string> </ dict> '
RKS

3
Toll! Sie dürfen (und werden sogar ermutigt), Ihre eigenen Fragen zu StackOverflow zu beantworten, um anderen in einer ähnlichen Situation zu helfen.
Johnsyweb

Ich werde Ihre Antwort positiv bewerten, wenn Sie einige Beispiele für die Verwendung und Ausgabe angeben. Viel Glück.
Shellter

Antworten:


149

In Bash Version 4 wurden assoziative Arrays eingeführt.

declare -A arr

arr["key1"]=val1

arr+=( ["key2"]=val2 ["key3"]=val3 )

Das arr-Array enthält jetzt die drei Schlüsselwertpaare. Bash ist ziemlich begrenzt, was Sie mit ihnen machen können, kein Sortieren oder Knallen usw.

for key in ${!arr[@]}; do
    echo ${key} ${arr[${key}]}
done

Durchläuft alle Schlüsselwerte und gibt sie wieder.

Hinweis: Bash 4 wird aufgrund seiner GPLv3-Lizenz nicht mit Mac OS X geliefert. Sie müssen es herunterladen und installieren. Mehr dazu hier


25
Es ist wichtig zu beachten, dass Bash 4 aufgrund seiner GPLv3-Lizenz nicht mit Mac OS X geliefert wird. Sie müssen es herunterladen und installieren. (Apple
liefert

5
Hier gibt es einen Nachteil: Die Iteration ist nicht nach Einfügereihenfolge geordnet.
AlikElzin-Kilaka

Benötigt definitiv Bash Version 4. Andernfalls deklarieren Sie, dass -A nicht funktioniert. Mac kommt mit Bash 3.2
Mamun

2
Dies liegt nicht an der GPLv3-Lizenz, sondern daran, dass Apple keine GPLv3-lizenzierte Software verwenden möchte. Es ist also nichts falsch mit der GPLv3-Lizenz, aber etwas stimmt nicht mit Apple, nehme ich an.
Tech Nomad

31

Wenn Sie ein einfaches Trennzeichen verwenden können, ist dies ein sehr einfacher Oneliner:

for i in a,b c_s,d ; do 
  KEY=${i%,*};
  VAL=${i#*,};
  echo $KEY" XX "$VAL;
done

Hiermit iwird mit Zeichenfolgen wie "a,b"und gefüllt "c_s,d". jeweils durch Leerzeichen getrennt. Nach dem verwenden dowir die Parametersubstitution , um das Teil vor dem Komma ,und das Teil danach zu extrahieren .


Können Sie bitte das Beispiel erklären, das Sie gegeben haben?
AlikElzin-Kilaka

Frage: Funktioniert es, wenn beine Variable Leerzeichen enthält?
AlikElzin-Kilaka

In meinem Beispiel ist b keine Variable und nein, es funktioniert nicht, da die Liste für die for-Schleife durch Leerzeichen getrennt ist.
Mathe

2

Für die dauerhafte Speicherung von Schlüsseln / Werten können Sie kv-basheine reine Bash-Implementierung der Schlüssel- / Wertedatenbank verwenden, die unter https://github.com/damphat/kv-bash verfügbar ist

Verwendung

git clone https://github.com/damphat/kv-bash
source kv-bash/kv-bash

Versuchen Sie, einige permanente Variablen zu erstellen

kvset myName  xyz
kvset myEmail xyz@example.com

#read the varible
kvget myEmail

#you can also use in another script with $(kvget keyname)
echo $(kvget myEmail)

1

In Bash verwenden wir

declare -A name_of_dictonary_variable

damit Bash versteht, dass es sich um ein Wörterbuch handelt.

Zum Beispiel möchten Sie dann ein soundsWörterbuch erstellen ,

declare -A sounds

sounds[dog]="Bark"

sounds[wolf]="Howl"

wo dogund wolfsind "keys"und Barkund Howlsind "values".

Sie können auf alle Werte zugreifen mit: echo ${sounds[@]}ODERecho ${sounds[*]}

Sie können auf alle Schlüssel nur zugreifen, indem Sie: echo ${!sounds[@]}

Und wenn Sie einen Wert für einen bestimmten Schlüssel wünschen, können Sie Folgendes verwenden:

${sounds[dog]}

Dies gibt Ihnen value ( Bark) für key ( Dog).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.