JQ: передать строковый аргумент без кавычек - PullRequest
0 голосов
/ 04 сентября 2018

Я хотел бы передать аргумент без кавычек (JQ arg имеет двойные кавычки по умолчанию), так как он должен использоваться в качестве фильтра. Например,

propt='.properties'
final=($(jq -r -c --arg p $propt '$p' sample.json))
echo $final

sample.json

{
  "type": "object",
  "description": "Contains information",
  "properties": {
    "type": {
      "description": "Type"
        }
   }
}

Таким образом, в конечном итоге он печатает .properties вместо ожидаемого {"type":{"description":"Type"}} Я использую оболочку bash для этой цели.

Пожалуйста, дайте мне знать, что я делаю неправильно.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Если я вас правильно понимаю, вы отвлекаетесь, думая, что вам нужно установить переменную в jq вместо того, чтобы просто позволить оболочке выполнить расширение:

% foo='.properties'
% jq -r -c  "$foo" sample.json 

вывод:

{"type":{"description":"Type"}}

Обратите внимание на двойные кавычки на $ foo, которые позволяют оболочке расширять переменную до .properties. Тем не менее, вы можете небезопасно использовать: jq -r -c $foo sample.json

0 голосов
/ 07 сентября 2018

Поскольку jq не имеет функции «eval», соответствующий способ программного указания пути в jq - это использование массива JSON в сочетании со встроенными jq getpath и setpath, в зависимости от ситуации.

Таким образом, в вашем случае вы можете использовать опцию командной строки -—argjson для передачи интересующего вас пути, например,

-—argson p '["properties"]'

и ваша jq-программа будет использовать getpath($p).

Нет необходимости говорить, что этот подход работает для произвольно вложенных путей.

0 голосов
/ 04 сентября 2018

Вы не можете использовать --arg таким образом. Значение --arg является строкой, а не выражением фильтра jq. Если вы сделаете --arg p .properties, тогда $p будет содержать строку ".properties", она не будет считаться программой. Найдите другой способ сделать то, что вы хотите, возможно, определив функцию.

Например, если вы префикс вашей программы с def p: .properties;, то вы можете использовать .|p в своей программе так же, как вы используете $p сейчас, и она получит доступ к .properties любого значения в контексте.

...