如何利用shell返回的逗号分隔列表,通过jq筛选符合条件的JSON对象
错误原因
你遇到的报错是两个问题叠加导致的:
- 你直接把shell命令
$(./getClasses.sh)写在了jq的单引号过滤规则里,单引号会阻止shell做命令展开,jq会把这段内容当成自身语法解析,自然报错 - jq没有
included这个内置函数,小写in运算符是用来检查对象的键是否存在,不是用来检查元素是否在数组里的,检查数组包含元素要用到大写的IN运算符(jq 1.5及以上版本支持)或者index函数。
正确实现方案
通过jq的--arg参数把脚本输出的逗号分隔列表传入jq内部,再拆分后做过滤即可:
写法1(兼容所有jq版本)
jq --arg allowed_classes "$(./getClasses.sh)" '.result.coverage.coverage[] | select(.name == ($allowed_classes | split(",")[]))' tests.json
写法2(jq 1.5+,大列表性能更好)
jq --arg allowed_classes "$(./getClasses.sh)" '.result.coverage.coverage[] | select(.name IN($allowed_classes | split(",")))' tests.json
逻辑说明
--arg allowed_classes "$(./getClasses.sh)":提前执行你的脚本,把返回的逗号分隔字符串作为jq内部变量$allowed_classes传入,避免shell引用和转义问题$allowed_classes | split(","):把逗号分隔的类名字符串拆成jq内部的数组结构select过滤逻辑:只保留name字段在上述数组内的对象
按照你的示例数据,如果./getClasses.sh返回ApexClass1,ApexClass2,执行命令后会返回前两个类的覆盖率对象,符合需求。
内容的提问来源于stack exchange,提问作者Patlatus
相关产品推荐
相关产品推荐

