我的bash脚本中有如下变量:
server1_name = 'server-1'
server1_url = 'http://server-1.net'
server2_name = 'server-2'
server2_url = 'http://server-2.net'我如何使用我的变量创建像这样的json并设置为new var:
[
{
"name": "server-1",
"url": "http://server-1.net"
},
{
"name": "server-2",
"url": "http://server-2.net"
}
]我尝试过的:
export jsonArray = $("[{\"name\":"$server1_name",\"url\":\"$server1_url\"},{\"name\":"$server2_name",\"url\":\"$server2_url\"}]" | jq -rec .)发布于 2021-08-26 14:38:29
使用--arg传递字符串,然后可以按预期创建JSON:
#!/bin/bash
server1_name='server-1'
server1_url='http://server-1.net'
server2_name='server-2'
server2_url='http://server-2.net'
result=$(jq -n \
--arg name1 "$server1_name" \
--arg url1 "$server1_url" \
--arg name2 "$server2_name" \
--arg url2 "$server2_url" \
'[ { "name": $name1, "url": $url1 }, { "name": $name2, "url": $url2 } ]')
echo "$result"将产生:
[
{
"name": "server-1",
"url": "http://server-1.net"
},
{
"name": "server-2",
"url": "http://server-2.net"
}
]发布于 2021-08-26 15:00:13
您可以构造两个名称和urls数组,然后调整this answer以将这两个数组“压缩”到所需的对象数组中。
jq -n \
--arg name1 "$server1_name" \
--arg url1 "$server1_url" \
--arg name2 "$server2_name" \
--arg url2 "$server2_url" \
'[$name1, $name2] as $names |
[$url1, $url2] as $urls |
[([$names, $urls] | transpose[]) as [$name, $url] |{$name, $url}]'这样做的好处是,随着名称/url对数量的增加,您只需要修改定义$names和$urls的前两个过滤器;其余的过滤器保持不变。您甚至可以将其划分为jq的单独使用,以便于定义大型服务器列表。
names=$(jq -n --arg v1 "$server1_name" --arg v2 "$server2_name" '[$v1, $v2]')
urls=$(jq -n --arg v1 "$server1_url" --arg v2 "$server2_url" '[$v1, $v2]')
jq -n \
--argjson names "$names" \
--argjson urls "$urls" \
'[([$names, $urls] | transpose[]) as [$name, $url] | {$name, $url}]'https://stackoverflow.com/questions/68940509
复制相似问题