2016-01-12 3 views
16

Вот мой config.json:передачи аргументов JQ фильтра

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

Вот команды мой Баш:

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.

Может кто-нибудь мне помочь?

+0

Вы пробовали удаление ' "'' около $ V'? Почему вы не используете оболочку для заполнения переменной типа 'JQ" .dev.projects. $ PRJNAME»config.json'? –

+0

@RamboRamon, используя оболочку для заполнения переменной, подвержен ошибкам - подумайте, содержит ли она символы, такие как кавычки, которые необходимо экранировать. 'Jq' гарантированно генерирует синтаксически допустимый вывод. –

ответ

21

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

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

Что делать, если я хочу пройти 2 или более параметров? Можете ли вы показать мне пример? – lisi4ok

+5

Вы можете передать несколько аргументов с помощью команды '--arg' несколько раз, например:' jq --arg foo 1 --arg bar 2 -n '[$ foo, $ bar]' ' –

+0

Возможно ли передать несколько компонентов в arg? eg' PRJNAME = '. dev.projects.prj1' jq --arg v "$ PRJNAME" '[$ v]' config.json '. Конечно, этот код не работает - он преобразует arg в строку, окруженную квадратными скобками, поэтому я предполагаю, что ей не нравится точечная нотация ... – lane

2

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

--arg a v set variable $a to value <v>; 
--argjson a v set variable $a to JSON value <v>; 
Смежные вопросы