Я создаю объекты JSON из заданных данных. Если создается объект JSON, он должен быть добавлен к массиву JSON, который хранится в переменной bash. Этот пакет объектов JSON позже должен быть отправлен через curl.
Код:
declare -a data=('10.4' '100.23' '20.02');
batch = "[]"
for data_object in "${data[@]}"; do
json=$(jq -n --arg inf $data_object '{data: $inf|tonumber}')
batch=$(jq '$batch += ["$json"]')
done
Ожидаемый результат после n циклов должен быть:
[
{
"data": 10.4
},
{
"data": 100.23
},
{
"data": 20.02
}
]
Я постоянно получаю эту ошибку: jq: error: $batch is not defined at <top-level>, line 1:
. Как я могу это решить?
Ну как batch = "[$(printf '{"information": %s}\n' "${data[@]}" | paste -sd,)]"
?
Вам не нужны никакие хакерские операции такого рода, и вы можете сделать все это в jq
. Опубликуйте минимальный воспроизводимый пример с необходимым вводом и точным выводом.
Откуда $information
?
Я обновил пост, так что он имеет немного больше смысла!
Вы, несомненно, могли бы заставить свою программу работать, обновив batch
следующим образом:
batch=$(jq --argjson json "$json" '. + [$json]' <<< "$batch")
Однако подход, который вы используете, кажется одновременно хрупким и поразительно неэффективным. Рассматривали ли вы возможность накопления всех элементов в файле (в виде потока сущностей JSON), а когда их нужно объединить в массив, используя jq -s .
?
В приведенном конкретном примере было бы достаточно написать:
printf "%s\n" "${data[@]}" |
jq -n '[{data: inputs}]' |
curl -d @- <OTHER CURL OPTIONS>
То есть вы можете передавать прямо в curl
.
Обратите внимание, что вызов tonumber
не нужен, независимо от того, известно ли, что все элементы data
являются числами. Для справки, tonumber
часто используется в идиоме (tonumber? // .)
в случае, если строка или другой ввод не является числовым.
Если бы над каждым элементом данных нужно было выполнить другие действия, которые jq не может легко обработать:
batch=$(
(
for data_object in "${data[@]}"; do
jq -n --argjson inf "$data_object" '{data: $inf}'
done
) | jq -s .
)
Здесь вызов tonumber
излишен, на этот раз благодаря --argjson
.
Во-первых, спасибо за ответ - это именно то, что мне было нужно. Я всегда готов учиться и находить лучшие решения, особенно если мои на самом деле настолько плохи, так в чем будет польза от хранения их в отдельных файлах и как это будет выглядеть? Для получения дополнительной информации завиток, который отправляет пакет, вызывается сразу после цикла for.
@FlixRo, добавлено упомянутое решение jq -s в ответ.
batch
используется в контексте оболочки, он не импортируется автоматически в jq