JQ не работает с ключами, которые содержат черту из переменной - PullRequest
0 голосов
/ 13 февраля 2019

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

jq '.["key-key"]'

и отдельно от этого, если вы хотитечтобы включить переменную в jq, вам нужно использовать двойные кавычки вместо одинарных кавычек;

jq "."${var[i+1]}""

, но моя переменная содержит тире, и в этом случае я пыталсяобъедините 2 приведенных выше примера, но это не сработало:

var=key-key
jq ".["${var[i+1]}"]."key""

как мне получить эту работу?

Обновление:

Это последний скрипт, который язабыл упомянуть;

declare -a var=(
    "key-key"
    "key2-key2"
    "key3-key3"
)

for ((i=0; i<${#var[@]})); do
    curl -s "url" | jq ".["${var}"]."something""
done

1 Ответ

0 голосов
/ 13 февраля 2019

Чтобы иметь двойные кавычки в команде jq, заключенной в двойные кавычки, вы должны экранировать их обратной косой чертой:

jq ".[\"key-key\"]"

Другая проблема с вашей последней командой заключается в том, что ${var[i+1]} расширяется до пустой строки, потому что этот синтаксис используется для индексации элементов массива, и вы ранее определили var как простую строку.

Лучший способ работы с переменными в командах jq - определить их с помощью опции --arg name value, после чего вы можете обращаться к ним с помощью $foo в команде, заключенной в одинарные кавычки:

jq --arg keyName key-key '.[$keyName]'

Чтобы исправить код, включенный в обновление, я использовал бы следующее:

declare -a var=(
    "key-key"
    "key2-key2"
    "key3-key3"
)

json=$(curl -s "url")

for searchedKey in "${var[@]}"; do
    echo $json | jq --arg keyName $searchedKey '.[$keyName].something'
done
...