在bash中将数组变量传递给jq

时间:2019-10-15 16:51:36

标签: bash jq

是否可以在jq中传递并使用类型为array的变量?

jq --arg ips "${IPs[0]}" '.nodes.app.ip = $ips[0] | .nodes.data.ip = $ips[1]' nodes.json

1 个答案:

答案 0 :(得分:3)

一般情况下的解决方案是使用NUL分隔符在stdin上传递该数组:

IPs=( 1.2.3.4 5.6.7.8 )
original_doc='{"nodes": { "app": {}, "data": {} }}'

jq -Rn --argjson original_doc "$original_doc" '
  input | split("\u0000") as $ips
  | $original_doc
  | .nodes.app.ip = $ips[0]
  | .nodes.data.ip = $ips[1]
' < <(printf '%s\0' "${IPs[@]}")

...作为输出发出:

{
  "nodes": {
    "app": {
      "ip": "1.2.3.4"
    },
    "data": {
      "ip": "5.6.7.8"
    }
  }
}

这对于IP地址数组是过大的,但是在通常情况下,即使对于主动敌对的数组(带有文字引号,文字换行符和其他难以解析的数据的数组),它也适用。


如果要保持stdin干净,可以使用jq的第二个副本将数组转换为JSON:

IPs=( 1.2.3.4 5.6.7.8 )
IPs_json=$(jq -Rns 'input | split("\u0000")' < <(printf '%s\0' "${IPs[@]}"))

jq --argjson ips "$IPs_json" '
    .nodes.app.ip = $ips[0]
  | .nodes.data.ip = $ips[1]
' <<<'{"nodes": { "app": {}, "data": {} }}'