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

如何用Shell脚本结合jq判断JSON数组中Jerry状态为APPROVED

问题:判断Jerry用户是否存在且状态为APPROVED的Shell脚本修正

需求:当且仅当用户JERRY存在且对应的state字段为APPROVED时,将Shell变量hasJerry设为true,其他情况(Jerry状态为REJECTED或不存在)设为false。

示例JSON

示例1(应返回true):

[
    {
        "user": {
            "login": "TOM"
        },
        "body": "",
        "state": "APPROVED"
    },
    {
        "user": {
            "login": "JERRY"
        },
        "body": "",
        "state": "APPROVED"
    },
    {
        "user": {
            "login": "ANDY"
        },
        "body": "",
        "state": "REJECTED"
    }
]

示例2(Jerry状态为REJECTED,应返回false):

[
    {
        "user": {
            "login": "TOM"
        },
        "body": "",
        "state": "APPROVED"
    },
    {
        "user": {
            "login": "JERRY"
        },
        "body": "",
        "state": "REJECTED"
    },
    {
        "user": {
            "login": "ANDY"
        },
        "body": "",
        "state": "REJECTED"
    }
]

示例3(Jerry不存在,应返回false):

[
    {
        "user": {
            "login": "TOM"
        },
        "body": "",
        "state": "APPROVED"
    },
    {
        "user": {
            "login": "ANDY"
        },
        "body": "",
        "state": "REJECTED"
    }
]

用户尝试的错误脚本

hasJerry = false
if [ (jq -r '.[].user.login | index("JTHOM949")') && (jq -r '.[].state' == "APPROVED") ]; then

    hasJerry = true

fi

修正后的脚本

# 初始化变量为false
hasJerry=false

# 使用jq过滤出同时满足user.login=JERRY且state=APPROVED的条目
# 如果存在这样的条目,jq返回"true",否则返回"false"
result=$(jq -r 'any(.[]; .user.login == "JERRY" and .state == "APPROVED")' input.json)

# 根据jq的结果设置变量
if [ "$result" = "true" ]; then
    hasJerry=true
fi

# 可选项:输出结果验证
echo "hasJerry: $hasJerry"

脚本说明

  1. 变量赋值修正:Shell中变量赋值不能有空格,hasJerry=false才是正确写法,原脚本的hasJerry = false会触发语法错误。
  2. 关联条件判断:原脚本分开查询所有用户的login和所有state,无法保证两个条件对应同一个用户。使用jq的any()函数,可一次性检查数组中是否存在同时满足user.login == "JERRY"和state == "APPROVED"的对象。
  3. 结果处理:jq -r 'any(.[]; .user.login == "JERRY" and .state == "APPROVED")'直接返回true或false,只需判断该结果即可设置hasJerry变量。

测试方法

将示例JSON保存为input.json,运行修正后的脚本,对应三个示例的输出分别为:

  • 示例1:hasJerry: true
  • 示例2:hasJerry: false
  • 示例3:hasJerry: false

内容的提问来源于stack exchange,提问作者Karthik Peddineni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:25:22