Я пытаюсь создать следующую структуру объекта JSON:
{
"hard-coded-value": false,
"dynamic-value-1": true,
"dynamic-value-2": true,
"dynamic-value-3": true
}
Мой массив динамических значений называется DYNAMIC_VALUES
.
Я написал следующий код bash:
DYNAMIC_VALUES=("dynamic-value-1" "dynamic-value-2" "dynamic-value-3")
JSON_OBJECT=$( jq -n '{"hard-coded-value": false}' )
for i in "${DYNAMIC_VALUES[@]}"
do
JSON_OBJECT+=$( jq -n \
--arg key "$i" \
'{($key): true}' )
done
echo $JSON_OBJECT
Приведенный выше код печатает следующее
{ "hard-coded-value": false }{ "dynamic-value-1": true }{ "dynamic-value-2": true }{ "dynamic-value-3": true }
Я хочу, чтобы этот вывод выглядел так же, как вывод, описанный в верхней части этого вопроса, но я не могу понять, как сообщить jq о добавлении к корневому объекту JSON вместо создания группы объектов.
Там не нужна петля.
$ dynamic_values=('dynamic-value-1' 'dynamic-value-2' 'dynamic-value-3')
$ printf '%s\n' "${dynamic_values[@]}" | jq -nR '{hardcoded_value: false} | .[inputs] = true'
{
"hardcoded_value": false,
"dynamic-value-1": true,
"dynamic-value-2": true,
"dynamic-value-3": true
}
Это сломается, если один из элементов массива содержит перевод строки. Для этого в JQ 1.6 есть --args, которые можно использовать, как показано ниже.
$ dynamic_values=('dynamic-value-1' $'dynamic-value-2\n' 'dynamic-value-3')
$ jq -n '{hardcoded_value: false} | .[$ARGS.positional[]] = true' --args "${dynamic_values[@]}"
{
"hardcoded_value": false,
"dynamic-value-1": true,
"dynamic-value-2\n": true,
"dynamic-value-3": true
}
@ Дэн --args "${dynamic_values[@]/#/run-}"
Ах, я полностью пропустил опцию
--args
в руководстве - спасибо! Есть ли способ добавить строку к каждому элементу массива? Что-то вроде--args "run-${dynamic_values[@]}"
для создания «run-dynamic-value-1», «run-dynamic-value-2» и т. д. Одним из преимуществ цикла, который у меня был, была возможность добавлять строку в начало, выполняя--arg key run-"$i"
.