übergeben von Argumenten an jq-filter
Hier ist meine config.json:
{
"env": "dev",
"dev": {
"projects" : {
"prj1": {
"dependencies": {},
"description": ""
}
}
}
}
Hier sind meine bash-Befehle:
PRJNAME='prj1'
echo $PRJNAME
jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json
jq '.dev.projects.prj1' config.json
Die Ausgabe:
prj1
null
{
"dependencies": {},
"description": ""
}
Also $PRJNAME ist prj1, aber der erste Aufruf gibt nur null
.
Kann mir jemand helfen?
Haben Sie versucht, entfernen die
verwenden der shell zum füllen der Variablen ist fehleranfällig-man denke etwa wenn es enthält Zeichen wie Anführungszeichen, die müssen escaped werden.
"
um $v
? Warum bist du nicht mit der Schale zu füllen, die variable wie jq ".dev.projects.$PRJNAME" config.json
?verwenden der shell zum füllen der Variablen ist fehleranfällig-man denke etwa wenn es enthält Zeichen wie Anführungszeichen, die müssen escaped werden.
jq
ist garantiert zu generieren syntaktisch gültige Ausgabe.InformationsquelleAutor lisi4ok | 2016-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den jq-Programm
.dev.projects."$v"
in deinem Beispiel wird buchstäblich versuchen Sie finden einen Schlüssel mit dem Namen"$v"
. Versuchen Sie Folgendes statt:Sie können pass-mehr als ein argument mithilfe der
--arg
Anleitung mehrere Male, wie in:jq --arg foo 1 --arg bar 2 -n '[$foo, $bar]'
Ist es möglich, übergeben Sie mehrere Komponenten in der arg? zB
PRJNAME='.dev.projects.prj1' jq --arg v "$PRJNAME" '[$v]' config.json
. Sicher, der code funktioniert nicht - es wandelt das argument in eine Zeichenfolge, umgeben von eckigen Klammern, so dass ich vermute, dass es nicht wie die Punkt-notation...entfernen Sie die " from [$v]
InformationsquelleAutor
können Sie auch
--argjson
wenn Sie Ihre json.argjson
bei der übergabe einer Zahl oder boolean, die Sie nicht wollen, eingewickelt in Anführungszeichen.InformationsquelleAutor Sebastien DIAZ
Als fragte in einem Kommentar oben, es gibt einen Weg, um pass mehrere argumets.
Vielleicht gibt es eine elegantere Möglichkeit, aber es funktioniert.
natürlich können Sie diese kombinieren!
InformationsquelleAutor LuWa