使用jq在Shell脚本中检测嵌套JSON的base_score是否大于7.0
解决方案
可以用jq的递归遍历和any()函数实现这个需求,以下是完整的Shell脚本:
#!/bin/bash # 检测JSON中是否存在至少一个base_score大于7.0 if jq -e 'any(..; .base_score? | numbers > 7.0)' >/dev/null; then exit 1 fi
关键细节说明:
..:递归遍历JSON的所有节点,不管嵌套层级有多深.base_score?:使用可选链操作符,避免遇到没有base_score字段的节点时抛出错误numbers:确保只处理数字类型的base_score值,过滤掉字符串等非数字的无效值any(..; 条件):jq内置函数,只要存在任意一个节点满足指定条件,就返回true-e:让jq的退出码与输出的布尔值对应——输出true时退出码为0,false时为1,方便Shell脚本判断>/dev/null:屏蔽jq的标准输出,只关注其退出码
用法示例:
- 如果JSON数据来自标准输入(比如管道传递):
cat your_data.json | ./check_score.sh - 如果JSON数据来自文件:
修改脚本中的jq命令,直接指定文件路径:if jq -e 'any(..; .base_score? | numbers > 7.0)' your_data.json >/dev/null; then exit 1 fi
测试验证:
- 当JSON中存在
base_score >7.0时,脚本会执行exit 1 - 当所有
base_score都≤7.0或不存在该字段时,脚本正常退出(退出码0)
内容的提问来源于stack exchange,提问作者Ajay Sabarish
相关产品推荐
相关产品推荐

