ubuntuusers.de

Bash: Einfachste Methode um assoziative Arrays mit Schlüssel-Werte Paaren aus Datei zu befüllen

Status: Gelöst | Ubuntu-Version: Ubuntu 19.04 (Disco Dingo)
Antworten |

ui

Anmeldungsdatum:
22. November 2008

Beiträge: 603

Gibt es fertige Kommandos oder Funktionen in der Bash, die JSON-Dateien, YAML-Dateien (oder welches Textdatei-Format für Schlüssel-Wert Paare Ihr auch empfehlt) einlesen und so konvertieren, dass ich das Ergebnis direkt in der Variable eines assoziativen Arrays abspeichern kann?

Z.B. ein Bash-Builtin folgender Art:

1
declare -A assoziativesArray = json2AssoziativesArray(input.json)

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9615

Wohnort: Münster

Für „Schlüssel=Wert“ Angaben in einer Datei sollte z.B. dieses Idiom funktionieren:

while IFS== read -r key value; do A["$key"]="$value" ; done < "$Dateiname" 

Ist natürlich anzupassen auf das tatsächlich benutzte Trennzeichen (hier beispielhaft „=“) und die Schlüssel dürfen eben dieses Trennzeichen nicht enthalten.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11243

Wohnort: München

Ich würde das ja lieber mit ohne Shell machen und gleich eine Skriptsprache wie Python3 nutzen, wenn etwas anderes als mit einem eindeutigen Zeichen getrennte Werte im Spiel sind, aber prinzipiell kannst du z.B. so mit jq vorgehen, um ein flaches JSON-Objekt in einen Array einzulesen:

test.json

1
2
3
4
5
{
  "foo": "bar",
  "spam": "ham",
  "monty": "python"
}
1
2
3
4
5
6
declare -A array
while IFS=$'\t\n' read -r key value
do
  array["$key"]="$value"
  echo $key=$value
done < <(jq -r 'keys[] as $k | "\($k)\t\(.[$k])"' test.json)

ui

(Themenstarter)

Anmeldungsdatum:
22. November 2008

Beiträge: 603

Danke Euch! Super Infos. Jetzt sehe ich klarer.

Nur für Anfänger wie mich interessant:

kBs Vorschlag setzt voraus, dass man vorher das Array A deklariert mit

1
declare -A A

Macht man das nicht, produzieren folgende Testdaten seltsame Ergebnisse:

a=1
b=2
c=3


Unverständliche Ausgaben in der Bash bei nicht deklariertem Array:

1
2
3
4
5
6
7
8
# Länge des assoziativen Arrays:
echo ${#A[@]} # Ausgabe: 1

# Noch lustiger:
echo ${A[a]} # Ausgbae: 3
echo ${A[b]} # Ausgbae: 3
echo ${A[c]} # Ausgbae: 3
echo ${A[gibtsNicht]} # Ausgbae: 3
Antworten |