jq einen Wert mit mehreren --arg hinzufügen oder aktualisieren

jq einen Wert mit mehreren --arg hinzufügen oder aktualisieren

Ich habe file.jsonin der Struktur:

{
  "connections": {}
}

Ich möchte das Verbindungsobjekt mit Variablen $1und aktualisieren $2. Ich versuche:

jq --arg ssid "$1" --arg pass "$2" '.connections.$ssid = "$pass"' file.json > tmp.json && mv tmp.json file.json

Aber ich komme zurückjq: error: syntax error, unexpected '$', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1: .connections.$ssid = "$pass"

Ich erwarte script.sh value keyFolgendes:

{
  "connections": {key:"value"}
}

Wie kann ich das Objekt mit mehreren Argumenten aktualisieren

Antwort1

Sie müssen verwenden[]Indizierungum Variablen (oder irgendetwas anderes als wörtlich) als Schlüssel zu verwenden:

jq --arg ssid abc --arg pass 123 '.connections[$ssid] = $pass' < file.json
{
  "connections": {
    "abc": "123"
  }
}

Hier wird mit dem Wert von als Schlüssel [$ssid]indiziert . Der Fehler lag bei " ", was eher ein Syntaxfehler ist als mit mehreren Variablen zu tun zu haben..connections$ssid.$

Variablenwerden nicht direkt als Zeichenfolgen ersetzt, wie dies in einem Shell-Skript der Fall sein könnte, sondern sind tatsächlich benannte lexikalische Bindungen, die im Ausdruckskontext verwendet werden müssen. Der Index könnte ein komplexerer Ausdruck sein: .connections[$ssid + "X"] = $passwürde zuerst ein X an das Ende setzen und das als Schlüssel verwenden.

verwandte Informationen