передача аргументов в фильтр jq



Вот мой конфиг.json:



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


Вот мои команды bash:



PRJNAME='prj1'

echo $PRJNAME

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


Вывод:



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


Таким образом, $PRJNAME-это prj1, но первый вызов выводит только null.



Кто-нибудь может мне помочь?
631   3  

3 ответов:

Программа jq .dev.projects."$v" в вашем примере будет буквально пытаться найти ключ с именем "$v". Попробуйте вместо этого сделать следующее:

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

Вы также можете использовать --argjson, когда делаете свой json.

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

Как указано в комментарии выше, есть способ передать несколько аргументов. Может быть, есть более элегантный способ, но он работает.

  • Если вы уверены, что всегда нужны все ключи, вы можете использовать это:
jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '

  • Если ключ не всегда используется, Вы можете сделать это следующим образом:
jq --arg key $k ' if key != "" then .[$key] else . end'

  • Если ключ иногда ссылается на массив:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

Конечно, вы можете комбинировать их!

Comments

    Ничего не найдено.