如何用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"
脚本说明
- 变量赋值修正:Shell中变量赋值不能有空格,
hasJerry=false才是正确写法,原脚本的hasJerry = false会触发语法错误。 - 关联条件判断:原脚本分开查询所有用户的login和所有state,无法保证两个条件对应同一个用户。使用jq的
any()函数,可一次性检查数组中是否存在同时满足user.login == "JERRY"和state == "APPROVED"的对象。 - 结果处理:
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
相关产品推荐
相关产品推荐

