передача аргументов в фильтр 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.
Кто-нибудь может мне помочь?
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