2016-01-12 21 views
16

ecco la mia config.json:passaggio di argomenti a filtro JQ

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

Qui sono comandi mia bash:

PRJNAME='prj1' 

echo $PRJNAME 

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

L'output:

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

Così $ PRJNAME è prj1 , ma la prima invocazione produce solo null.

Qualcuno può aiutarmi?

+0

Hai provato la rimozione del ' "'' intorno $ v'? Perché non stai usando la shell di compilare la variabile come 'JQ" .dev.projects. $ PRJNAME" config.json'? –

+0

@RamboRamon, usare la shell per riempire la variabile è soggetto a errori - pensa se contiene caratteri come virgolette che devono essere sfuggite. 'Jq' è garantito per generare un output sintatticamente valido –

risposta

21

Il programma jq .dev.projects."$v" nell'esempio cercherà letteralmente di trovare una chiave denominata "$v". Provate il seguente invece:

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 
+0

Cosa succede se voglio passare 2 o più parametri? Puoi mostrarmi l'esempio? – lisi4ok

+5

Puoi passare più di un argomento usando l'istruzione '--arg' più volte, come in:' jq --arg foo 1 --arg barra 2 -n '[$ pippo, $ bar]' ' –

+0

È possibile passare più componenti nell'arg, ad esempio' PRJNAME = '. dev.projects.prj1' jq --arg v "$ PRJNAME" '[$ v]' config.json '. Certamente quel codice non funziona - converte l'arg in una stringa circondata da parentesi quadre, quindi suppongo che non gli piaccia la notazione dei punti ... – lane

2

è possibile utilizzare anche --argjson quando si effettua la JSON.

--arg a v set variable $a to value <v>; 
--argjson a v set variable $a to JSON value <v>; 
Problemi correlati