Ich habe ein JSON-Array wie folgt:
{
"SITE_DATA": {
"URL": "example.com",
"AUTHOR": "John Doe",
"CREATED": "10/22/2017"
}
}
Ich möchte dieses Array mit jq durchlaufen, damit ich den Schlüssel jedes Elements als Variablennamen und den Wert als Wert festlegen kann.
Beispiel:
- URL = "example.com"
- AUTOR = "John Doe"
- CREATED = "22.10.2017"
Was ich bisher habe, iteriert über das Array, erstellt aber einen String:
constants=$(cat ${1} | jq '.SITE_DATA' | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]")
Welche Ausgänge:
URL=example.com
AUTHOR=John Doe
CREATED=10/22/2017
Ich möchte diese Variablen weiter unten im Skript verwenden:
echo ${URL}
Dies spiegelt jedoch im Moment eine leere Ausgabe wider. Ich schätze, ich brauche ein eval
oder etwas drin, kann aber nicht meinen Finger darauf legen.
declare -- “$key=$value”
und indirekt$AUTHOR
ohne Array indirekt ausführen. Es ist immer noch sicherer als eval, obwohl ÄnderungenPATH
oder etwas noch weniger möglich sind als diese Version.declare --
Version sicherer machen, indem Sie $ key mit einer Liste zulässiger Variablennamen vergleichen.Ich habe gerade festgestellt, dass ich die Ergebnisse durchlaufen und jede Iteration bewerten kann:
Erlaubt mir:
quelle
Ich mag den @ Michael-Vorschlag sehr. Manchmal können Sie wirklich nur einen Variablenwert extrahieren, um eine Aufgabe auf diesem bestimmten Server mit BASH auszuführen. Gewünschte Variablen sind also bekannt. Mit diesem Ansatz können Sie mehrere Aufrufe von jq vermeiden, um einen Wert pro Variable festzulegen, oder sogar die read-Anweisung mit mehreren Variablen verwenden, in denen einige gültig und leer sein können, was zu einer Wertverschiebung führt (das war mein Problem).
Mein vorheriger Ansatz, der dazu führt, führt zu einem Wertverschiebungsfehler, wenn .svID [] .ID = "" ( sv erhält den slotID- Wert
Wenn Sie das Objekt mit curl heruntergeladen haben, ist hier mein Ansatz, einige Variablen in einen Anzeigenamen umzubenennen, um Daten aus Datenarrays zu extrahieren
Die Verwendung von eval und filter löst das Problem mit einer Zeile und erzeugt Variablen mit dem gewünschten Namen
Der Vorteil in diesem Fall ist die Tatsache, dass im ersten Schritt alle gewünschten Variablen gefiltert, umbenannt und formatiert werden. Beachten Sie, dass dort drin ist. [0] | Dies ist sehr häufig der Fall, wenn die Quelle von einem RESTFULL-API-Server mit GET Antwortdaten wie folgt enthält:
Wenn Ihre Daten nicht aus einem Array stammen, z. ist ein Objekt wie:
Entfernen Sie einfach den Anfangsindex:
Dies ist eine alte Frage, aber ich fühlte mich geteilt, da es schwer zu finden war
quelle