json - example - pasando argumentos al filtro jq
awscli get instance id (3)
Aquí está mi config.json:
{
"env": "dev",
"dev": {
"projects" : {
"prj1": {
"dependencies": {},
"description": ""
}
}
}
}
Aquí están mis comandos de bash:
PRJNAME=''prj1''
echo $PRJNAME
jq --arg v "$PRJNAME" ''.dev.projects."$v"'' config.json
jq ''.dev.projects.prj1'' config.json
La salida:
prj1
null
{
"dependencies": {},
"description": ""
}
Entonces, $ PRJNAME es prj1, pero la primera invocación solo da como resultado null
.
¿Alguien me puede ayudar?
Como se preguntó en un comentario anterior, hay una manera de pasar múltiples argumentos. Tal vez haya una forma más elegante, pero funciona.
- Si está seguro que siempre todas las claves necesarias puede usar esto:
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 ''.[$key1] | .[$key2] | .[$key3] | .[$key4] ''
- Si la clave no se usa siempre, puedes hacerlo así:
jq --arg key $k '' if key != "" then .[$key] else . end''
- Si la clave a veces se refiere a una matriz:
jq --arg key $k '' if type == "array" then .[$key |tonumber] else .[$key] end''
Por supuesto que puedes combinar estos!
El programa jq .dev.projects."$v"
en su ejemplo, literalmente, intentará encontrar una clave llamada "$v"
. Intente lo siguiente en su lugar:
jq --arg v "$PRJNAME" ''.dev.projects[$v]'' config.json
Puedes usar también --argjson
cuando hagas tu json.
--arg a v set variable $a to value <v>;
--argjson a v set variable $a to JSON value <v>;