jq: доступ к полям с символом - в сценарии оболочки

Я пытаюсь получить доступ к полю «мой тег» из следующего json, используя jq из сценария оболочки:

JSON-файл:

{
    "tag": {
        "value": "hello"
    },
    "my-tag": {
        "value": "hello-my-tag"
    }
}

Сценарий оболочки:

#!/bin/bash
main()
{
    search="my-tag"
    file="myjson.json"
    value=($(jq ".$search.value" "$file"))
    echo $value
}

main "$@"

При выполнении этого скрипта я получаю следующую ошибку:

error: tag is not defined
.-tag.value
^^^
1 compile error

Как я могу правильно извлечь поле в сценарии оболочки?


person sajus    schedule 17.12.2015    source источник
comment
.-tag.value создает впечатление, что переменная оболочки $tag не содержит my-tag, как вы думаете (а содержит -tag). Вы уверены в его содержании?   -  person Etan Reisner    schedule 17.12.2015


Ответы (2)


Вам придется использовать нотацию ассоциативного массива для произвольных строк ключей

jq ".[\"$search\"].value" "$file
person glenn jackman    schedule 17.12.2015

Как правило, я бы настоятельно рекомендовал не размещать переменные оболочки в ваших фильтрах и использовать аргументы для их передачи.

jq --arg search "$search" '.[$search].value' "$file"

Ваша строка фильтра эквивалентна сценарию. Вы не хотели бы изменять свой сценарий каждый раз, когда хотите изменить значение, вы бы параметризовали его.

person Jeff Mercado    schedule 17.12.2015