解决jq中module1与module2循环引用导致的无限包含循环问题
解决jq模块互相引用导致的无限循环问题
核心思路:条件式导入模块
jq的include语句会无条件加载目标模块,互相引用时必然触发无限递归加载。解决关键是给每个模块定义唯一的全局标识变量,加载对方模块前先检查该变量是否已存在——若已存在,说明当前模块已经被加载过,就不再重复执行include。
具体实现步骤
- 修改module1.jq:
# 检查专属标识变量,未加载才执行后续逻辑 if ($module1_loaded | not) then # 定义全局标识变量,标记当前模块已加载 def $module1_loaded: true; # 条件加载module2 include "module2"; end # 你的obj1处理逻辑(示例) def process_obj1: "处理obj1: code1=\(.code1)" + # 调用module2的处理函数 ( .Object2s[] | "\n " + process_obj2 );
- 修改module2.jq:
# 同样检查专属标识变量 if ($module2_loaded | not) then def $module2_loaded: true; include "module1"; end # 你的obj2处理逻辑(示例) def process_obj2: "处理obj2: code1=\(.code1)" + # 调用module1的处理函数 ( .Object1s[] | "\n " + process_obj1 );
为什么你的变量判断之前没生效?
大概率是你把变量定义放在了include语句之后,或是用了局部变量而非def $var: ...;格式的全局变量。必须在include之前定义全局标识变量,并且在加载对方模块前先判断变量存在性,才能有效阻断循环。
测试验证
比如用module3.jq引用module1:
# module3.jq include "module1"; # 测试数据 { "code1":"254", "Object2s":[ {"code1":"574", "Object1s":[{"code1":"254"}]} ] } | process_obj1
执行命令jq -f module3.jq,就能正常输出处理结果,不会再触发无限循环。
内容的提问来源于stack exchange,提问作者canario
相关产品推荐
相关产品推荐

