#bash #jq
#bash #jq
Вопрос:
Я пытаюсь создать следующую структуру объекта 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 вместо создания группы объектов.
Ответ №1:
Вам не нужен цикл там.
$ dynamic_values=('dynamic-value-1' 'dynamic-value-2' 'dynamic-value-3')
$ printf '%sn' "${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-2n' 'dynamic-value-3')
$ jq -n '{hardcoded_value: false} | .[$ARGS.positional[]] = true' --args "${dynamic_values[@]}"
{
"hardcoded_value": false,
"dynamic-value-1": true,
"dynamic-value-2n": true,
"dynamic-value-3": true
}
Комментарии:
1. Ах, я полностью пропустил
--args
опцию в руководстве — спасибо! Есть ли способ добавить строку к каждому элементу в массиве? Что-то вроде--args "run-${dynamic_values[@]}"
создания «run-dynamic-value-1», «run-dynamic-value-2» и т.д. Одним из преимуществ цикла, который у меня был, была возможность добавлять строку, выполняя--arg key run-"$i"
.2. @Dan
--args "${dynamic_values[@]/#/run-}"