You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jq读取嵌套JSON数组并将单个值存入变量?

使用jq获取JSON数组中指定状态的VM IP地址

环境信息JSON文件

{
  "environments": {
    "dev": [
      {
        "id": "1",
        "vm-IP": "ww.www.ww.ww",
        "sql-name": "vmname1.eastus.cloudapp.azure.com",
        "status": "inactive"
      },
      {
        "id": "2",
        "vm-IP": "xx.xxx.xx.xx",
        "sql-name": "vmname2.eastus.cloudapp.azure.com",
        "status": "active"
      }
    ],
    "stg": {
      "id": "3",
      "vm-IP": "yy.yyy.yy.yy",
      "sql-name": "vmname3.eastus.cloudapp.azure.com"
    },
    "prod": {
      "id": "4",
      "vm-IP": "zz.zzz.zz.zz",
      "sql-name": "vmname4.eastus.cloudapp.azure.com"
    }
  }
}

可正常运行的stg环境脚本

针对非数组结构的stg环境,读取IP的脚本可以正常执行:

varFileName=myJsonFile.json
# 查看STG对象
jq '.environments.stg' $varFileName

# 获取stg的IP
stgIP=$(jq -r '.environments.stg."vm-IP"' $varFileName)
echo $stgIP

错误的dev环境脚本尝试

尝试获取dev数组中status为active的VM IP时,以下脚本均失败:

# 错误脚本1
devIP=$(jq -r '.environments.dev[]."vm-IP" | select(.status == "active")' $varFileName)
# 报错:error: Cannot index string with string "status"

# 错误脚本2
devIP=$(jq -r '.environments.dev[]."vm-IP" | 
select(.environments.dev[].status == "active")' $varFileName)
# 报错:error: Cannot index string with string "environments"

正确的jq过滤命令

问题出在你先提取了vm-IP字符串,之后无法再访问该字符串的status属性。正确的做法是先筛选数组中符合status == "active"的对象,再提取vm-IP:

varFileName=myJsonFile.json
devIP=$(jq -r '.environments.dev[] | select(.status == "active") | ."vm-IP"' $varFileName)
echo $devIP

命令解释

  1. .environments.dev[]:遍历dev数组中的每一个对象
  2. select(.status == "active"):筛选出status属性为active的对象
  3. ."vm-IP":从筛选后的对象中提取vm-IP字段值

如果dev数组中可能存在多个active状态的对象,该命令会输出所有符合条件的IP,每行一个。

内容的提问来源于stack exchange,提问作者dbradish-gmail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:18:27