web-dev-qa-db-fra.com

passer des arguments au filtre jq

Voici mon config.json:

{
    "env": "dev",
    "dev": {
        "projects" : {
            "prj1": {
                "dependencies": {},
                "description": ""
            }
        }
    }
}

Voici mes commandes bash:

PRJNAME='prj1'

echo $PRJNAME

jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json 
jq '.dev.projects.prj1' config.json 

Le résultat:

prj1
null
{
  "dependencies": {},
  "description": ""
}

Donc, $ PRJNAME est prj1, mais le premier appel ne génère que null.

Est-ce que quelqu'un peut m'aider?

20
lisi4ok

Le programme jq .dev.projects."$v" de votre exemple essaiera littéralement de trouver une clé nommée "$v". Essayez plutôt ce qui suit:

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 
29
user3899165

vous pouvez aussi utiliser --argjson lorsque vous faites votre json.

--arg a v   set variable $a to value <v>;
--argjson a v   set variable $a to JSON value <v>;
6
Sebastien DIAZ

Comme demandé dans un commentaire ci-dessus, il existe un moyen de passer de multiples argumets… .. Peut-être qu'il y a un moyen plus élégant, mais cela fonctionne.

  • Si vous êtes sûr d'avoir toujours toutes les clés nécessaires, vous pouvez utiliser ceci:
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '

  • Si la clé n'est pas toujours utilisée, vous pouvez le faire comme ceci:
jq --arg key $k ' if key != "" then .[$key] else . end'

  • Si la clé fait parfois référence à un tableau:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

bien sûr, vous pouvez les combiner!

2
LuWa