Вам не нужно использовать необработанный режим ввода в любом из вышеперечисленных случаев, просто используйте флаг --argjson
, чтобы включить массив непосредственно в фильтр. Таким образом, ваш первый случай просто становится
jq -n --argjson hosts '["host001", "host002", "host003"]' \
'{
jsonrpc: "2.0",
method: "host.get",
params: {filter: {"hostid": $hosts}},
auth: "038e1d7b1735c6a5436ee9eae095879e",
id: 1
}'
, а второй случай становится
jq -n --argjson group_id '["92", "93"]' --argjson hosts_id '["1111", "2222"]' \
'{
jsonrpc: "2.0",
method: "hostgroup.massadd",
params: {
groups: (reduce $group_id[] as $g (.; . + [{ group_id: $g }])),
hosts: (reduce $hosts_id[] as $h (.; . + [{ hostid: $h }]))
},
auth: "038e1d7b1735c6a5436ee9eae095879e",
id: 1
}'
. -n
предназначен для нулевого режима ввода, используемого при построении JSON с нуля, то есть для запуска фильтр без необходимости каких-либо входных файлов. Функция reduce()
выполняется итеративно для каждого входного объекта, а . + [{ group_id: $g }]
создает объект JSON для каждого созданного значения group_id
.
Using dynamic values in argument fields
Если вы не хотите жестко кодировать значения в arg json и хотите сделать его динамически настраиваемым из переменной, используйте заполнитель, такой как массив, для хранения нескольких значений
Case: 1
hosts=(host001 host002 host003)
jq -n --arg hosts_arg "${hosts[*]}" \
'{
jsonrpc: "2.0",
method: "host.get",
params: {filter: {"hostid": ($hosts_arg | split(" "))}},
auth: "038e1d7b1735c6a5436ee9eae095879e",
id: 1
}'
Случай 2:
groupid=(92 93)
hostid=(1111 2222)
jq -n --arg group_id "${groupid[*]}" --arg hosts_id "${hostid[*]}" \
'{
jsonrpc: "2.0",
method: "hostgroup.massadd",
params: {
groups: (reduce ($group_id | split(" ")[]) as $g (.; . + [{ group_id: $g }])),
hosts: (reduce ($hosts_id | split(" ")[]) as $h (.; . + [{ hostid: $h }]))
},
auth: "038e1d7b1735c6a5436ee9eae095879e",
id: 1
}'
Обратите внимание, что этот подход не работает, если ваш group_id или host_id содержит строки с пробелами.