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

Мне нужно выполнить cat build.json | jq '.Stage*.Name' 5 раз, где * — число от 1 до 5.

Я пробовал это:

for (( c=1; c<5; c++ ))
do
  echo $c
  cat build.json | jq '.Stage${c}.Name'
done

И я получил эту ошибку:

jq: error: syntax error, unexpected '$', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.Stage${c}.Name      
jq: 1 compile error

Как мне это сделать правильно?

Я не уверен, что вам действительно нужен здесь цикл оболочки. Какова собственно задача?

oguz ismail 17.12.2020 10:31

Для записи вам понадобятся двойные кавычки, чтобы это работало; но использование --arg — гораздо лучшее решение. Смотрите также stackoverflow.com/questions/6697753/…

tripleee 17.12.2020 10:58
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
338
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрим следующий файл json (./json.json):

{
    "data": {
        "stage1": {
            "name": 1
        },
        "stage2": {
            "name": 2
        },
        "stage3": {
            "name": 3
        },
        "stage4": {
            "name": 4
        },
        "stage5": {
            "name": 5
        }
    }
}

С этой настройкой вы можете использовать аргумент jq для разбора вашего итератора:

#!/bin/bash
for (( i = 1; i <= 5; i++ )); do
    echo "i: $i"
    jq --arg i $i '.data.stage'$i'.name' < json.json
done

Создание следующего вывода:

i: 1
1
i: 2
2
i: 3
3
i: 4
4
i: 5
5

передача аргументов в фильтр jq

Другие вопросы по теме