
Ich habe file.json
in der Struktur:
{
"connections": {}
}
Ich möchte das Verbindungsobjekt mit Variablen $1
und 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 key
Folgendes:
{
"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"] = $pass
würde zuerst ein X an das Ende setzen und das als Schlüssel verwenden.