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
-rd '\n' getInfo sv slotID <<< $(jq -r '(.infoCMD // "no info"), (.svID[].ID // "none"), (._id // "eeeeee")' <<< $data)
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
eval "$(jq -r '.[0] | {varNameExactasJson, renamedVar1: .var1toBeRenamed, varfromArray: .array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries | .[] | .key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"
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:
[{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}]
Wenn Ihre Daten nicht aus einem Array stammen, z. ist ein Objekt wie:
{"varNameExactasJson":"this value", "var1toBeRenamed: 1500, ....}
Entfernen Sie einfach den Anfangsindex:
eval "$(jq -r '{varNameExactasJson, renamedVar1: .var1toBeRenamed, varfromArray: .array[0].var, varValueFilter: (.array[0].textVar|ascii_downcase)} | to_entries | .[] | .key + "=\"" + (.value | tostring) + "\""' <<< /path/to/file/with/object )"
Dies ist eine alte Frage, aber ich fühlte mich geteilt, da es schwer zu finden war
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.