需要帮助在数组中创建对象

Need help to create objects inside array

jq 像这样查询,

jq -n  --arg cname "" --arg dns "" '
  {
    "extra_vars": {
      "oper_tasks": [ "records" ],
      "zone_info": [
        {
          "zone": "exmple.com",
          "records": [
            {
              "name": $cname,
              "type": "CNAME",
              "value": $dns,
              "ttl": 3600
            }
          ]
        }
      ]
    }
  }
'

上面的jq cn产生的结果是这样的,cname和dns在我们作为脚本执行的时候可以填入参数

"extra_vars": {
    "oper_tasks": [
      "records"
    ],
    "zone_info": [
      {
        "zone": "exmple.com",
        "records": [
          {
            "name": "",
            "type": "CNAME",
            "value": "",
            "ttl": 3600
          }
        ]
      }
    ]
  }
}

我们如何从输入文件创建多个对象,如下所示。类似于我们在 for 循环中的做法。

"extra_vars": {
"oper_tasks": [
  "records"
],
"zone_info": [
  {
    "zone": "exmple.com",
    "records": [
      {
        "name": <cname1 from input file>,
        "type": "CNAME",
        "value": "",
        "ttl": 3600
      },
      {
        "name": <cname2 from input file>,
        "type": "CNAME",
        "value": "",
        "ttl": 3600
      }
    ]
  }
]

}

假设您有一个文件 cnames.txt,其中每一行都包含一个 CNAME 域,后跟它的值:

foo.example.com google.com
bar.example.com whosebug.com

让我们创建该文件:

cat <<EOF > cnames.txt
foo.example.com google.com
bar.example.com whosebug.com
EOF

您可以使用 jq Manual 中描述的 --slurpfile 将一个 jq“嵌套”到另一个中。下面的命令应该做你想做的:

cat cnames.txt | xargs -n2 jq -n '{
    "name": $ARGS.positional[0],
    "type": "CNAME",
    "value": $ARGS.positional[1],
    "ttl": 3600
}' --args | jq -n --slurpfile records /dev/stdin '
  {
    "extra_vars": {
      "oper_tasks": [ "records" ],
      "zone_info": [
        {
          "zone": "example.com",
          "records": $records
        }
      ]
    }
  }
'

哪个returns:

{
  "extra_vars": {
    "oper_tasks": [
      "records"
    ],
    "zone_info": [
      {
        "zone": "example.com",
        "records": [
          {
            "name": "foo.example.com",
            "type": "CNAME",
            "value": "google.com",
            "ttl": 3600
          },
          {
            "name": "bar.example.com",
            "type": "CNAME",
            "value": "whosebug.com",
            "ttl": 3600
          }
        ]
      }
    ]
  }
}