2016-01-12 19 views
16

Oto moja config.json:Przekazywanie argumentów do filtra JQ

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

Oto moje polecenia bash:

PRJNAME='prj1' 

echo $PRJNAME 

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

Wyjście:

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

Więc $ PRJNAME jest PRJ1 , ale pierwsze wywołanie wyprowadza tylko null.

Czy ktoś może mi pomóc?

+0

Próbowałeś usuwania ' "'' $ v' wokół? Dlaczego nie używasz powłoki wypełnić zmiennej jak 'JQ" .dev.projects. $ PRJNAME”config.json'? –

+0

@RamboRamon, użycie powłoki do wypełnienia zmiennej jest podatne na błędy - zastanów się, czy zawiera ona znaki takie jak cytaty, które muszą zostać zmienione.) Jq' ma gwarantowane generowanie poprawnego składniowo wyniku –

Odpowiedz

21

W swoim przykładzie program jq .dev.projects."$v" dosłownie spróbuje znaleźć klucz o nazwie "$v". Spróbuj wykonać następujące czynności zamiast:

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

Co jeśli chcę przejść 2 lub więcej params? Czy możesz pokazać mi przykład? – lisi4ok

+5

Możesz przekazać więcej niż jeden argument za pomocą instrukcji '--arg' kilka razy, jak w:' jq --arg foo 1 --arg bar 2 -n "[$ foo, $ bar] '' –

+0

Czy można przekazać wiele komponentów w arg? np. 'PRJNAME ='. dev.projects.prj1 ' jq --arg v "$ PRJNAME" '[$ v]' config.json '. Z pewnością ten kod nie działa - konwertuje arg na ciąg otoczony nawiasami kwadratowymi, więc domyślam się, że nie podoba mu się notacja kropkowa ... – lane

2

można użyć zbyt --argjson podczas dokonywania JSON.

--arg a v set variable $a to value <v>; 
--argjson a v set variable $a to JSON value <v>; 
Powiązane problemy