【问题标题】:How to create array of json objects using jq and set to var in bash如何使用 jq 创建 json 对象数组并在 bash 中设置为 var
【发布时间】:2021-08-26 14:33:14
【问题描述】:

我的 bash 脚本中有这样的变量:

server1_name = 'server-1'
server1_url = 'http://server-1.net'

server2_name = 'server-2'
server2_url = 'http://server-2.net'

如何使用我的变量创建像这样的 json 并设置为新 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 .)

【问题讨论】:

  • 你想要一个动态的解决方案,还是那些例子是真正的价值?
  • 那些例子真正的价值@0stone0
  • 你可以同时显示两个选项

标签: arrays json bash shell jq


【解决方案1】:

使用--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"
  }
]

【讨论】:

  • 如何将结果设置为新的 var 以将其导出?
  • 请看我的编辑,忘了你想要它在另一个变量中!
  • 感谢您的回答!
【解决方案2】:

您可以构造两个名称和 url 数组,然后调整 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}]'

好处是随着name/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}]'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多