jq не заменяет значение json параметром

test.sh не заменяет значения параметров test.json ($input1 и $input2). result.json имеет такое же значение параметра "$ input1/solution/$input2.result"

 [
    {
      "ParameterKey": "Project",
      "ParameterValue": [ "$input1/solution/$input2.result" ]
     }
    ]

тест.ш

#!/bin/bash
input1="test1"
input2="test2"
echo $input1
echo $input2
cat test.json | jq 'map(if .ParameterKey == "Project"           then . + {"ParameterValue" : "$input1/solution/$input2.result" }             else .             end           )' > result.json

person spiderman    schedule 19.11.2017    source источник


Ответы (2)


переменные оболочки в скриптах jq должны интерполироваться или передаваться в качестве аргументов через --arg name value:

jq --arg inp1 "$input1" --arg inp2 "$input2" \
'map(if .ParameterKey == "Project" 
    then . + {"ParameterValue" : ($inp1 + "/solution/" + $inp2 + ".result") } 
else . end)' test.json

Выход:

[
  {
    "ParameterKey": "Project",
    "ParameterValue": "test1/solution/test2.result"
  }
]
person RomanPerekhrest    schedule 19.11.2017
comment
Не вставляйте значения оболочки в сценарий jq; в общем, вы не знаете, будет ли результатом будет допустимый jq скрипт. - person chepner; 19.11.2017
comment
@chepner, да, я предпочитаю передавать переменные через --arg name value - person RomanPerekhrest; 19.11.2017
comment
Если я удалю квадратные скобки в начале/конце json, это не сработает. { ParameterKey: Project, ParameterValue: [$input1/solution/$input2.result]} - person spiderman; 20.11.2017
comment
@spiderman, если убрать квадратные скобки - это будет совсем другой ввод. Другой ввод - другой вопрос, другое дело, не текущее - person RomanPerekhrest; 20.11.2017

В вашей программе jq вы указали «$ input1/solution/$ input2.result», и поэтому это строковый литерал JSON, тогда как вы, очевидно, хотите интерполяцию строк; вам также необходимо различать переменные оболочки ($ input1 и $ input2), с одной стороны, и соответствующие долларовые переменные jq (которые могут иметь или не иметь одинаковое имя) с другой.

Поскольку ваши переменные оболочки являются строками, вы можете передать их, используя параметр командной строки --arg (например, --arg input1 "$input1", если вы решили назвать переменные таким же образом).

Вы можете прочитать об интерполяции строк в руководстве по jq (см. https://stedolan.github.io/jq/manual, но обратите внимание на ссылки вверху для разных версий jq).

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

"\($input1)/solution/\($input2).result" 

Обратите внимание, что приведенная выше строка сама по себе НЕ является буквально строкой JSON. Только после интерполяции строк это становится так.

person peak    schedule 19.11.2017