Соответствие jq var внутри фигурных кавычек - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь заменить «$ {FOO}» на «BAR» (пожалуйста, обратите внимание: «$ {FOO}» НЕ является переменной оболочки - так она выглядит в json, и я не могу контролироватьjson)

Это работает:

echo '{ "name": "${FOO}" }' | \
    jq '.|(select (.name == "${FOO}") | .name) |= "BAR"'

{
  "name": "BAR"
}

Однако, если я хочу программно присвоить соответствующее значение (в данном случае MYVAR=FOO), я не могу заставить его работать, например

echo '{ "name": "${FOO}" }' | \
    jq --arg MYVAR FOO '.|(select (.name == "${$MYVAR}") | .name) |= "BAR"'
{
  "name": "${FOO}"
}

Мне кажется, что проблема заключается в кавычках вокруг соответствующей строки, так как это также работает:

echo '{ "name": "FOO" }' | \
    jq --arg MYVAR FOO '.|(select (.name == $MYVAR) | .name) |= "BAR"'
{
    "name": "BAR"
}

1 Ответ

0 голосов
/ 12 июня 2018

Во-первых, вам никогда не понадобится начальный .|, так как . здесь только фильтр "identity".

Во-вторых, важно различать переменные оболочки, с одной стороны, и jq $ -переменные.с другой.Если вы явно не связываете их вместе, они живут совершенно независимо.Как вы обнаружили, использование --arg MYVAR FOO устанавливает переменную jq $MYVAR в строку JSON "FOO";чтобы ссылаться на эту переменную, вы просто пишете $MYVAR в программе jq.

Также можно инициализировать переменную jq, используя:

--arg MYVAR "${MYVAR}"

Это устанавливает для переменной jq значение (строку) переменной оболочки.

В-третьих,имена jq «$ -вариумов» сильно ограничены: за исключением начального «$», они должны соответствовать регулярному выражению: [a-zA-Z _] [a-zA-Z_0-9] *

Таким образомесли вашей реальной целью является изменение вхождений строки JSON "$ {FOO}" с помощью "BAR", где FOO должен быть задан программно, вам придется принять другую стратегию.Это будет работать:

echo '{ "name": "${FOO}" }' |
  jq -c --arg MYVAR FOO --arg MYVALUE BAR '
    if .name == "${\($MYVAR)}" then .name = $MYVALUE else . end'

Это приводит к: {"name": "BAR"}

См. Также раздел "Использование jq в качестве движка шаблонов" in JQ Кулинарная книга .

...