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.