Bash调用jq通过变量追加JSON数组元素报变量未定义如何解决
报错原因
- Bash变量和jq的内部变量是完全隔离的,你将
$currentIssuesArr写在单引号包裹的jq表达式中时,Bash不会解析替换这个变量,jq会将它识别为自身的内部变量,而你没有向jq传递该变量,因此直接报未定义错误。 - 原有获取
currentIssuesArr的写法存在逻辑缺陷:read -r默认仅读取一行内容,如果curl返回的issues包含多条数据,会直接截断丢失剩余内容;同时你使用了jq -r输出原始非JSON格式的内容,后续传入jq作为JSON节点时会存在格式兼容问题。 - 存在隐藏逻辑问题:你每次循环都将结果重定向覆盖到
test.json,循环结束后只会保留最后一页的处理结果,之前页的追加操作都会被覆盖。
解决方案
使用jq的--argjson参数传递JSON格式的Bash变量,同时调整内容读取逻辑,参考修改后的代码:
for (( pageNumber=$page; pageNumber<=$countPages; pageNumber++ )) do # 直接保存接口返回的issues数组的JSON内容,去掉-r参数,不要用read截断 currentIssuesArr=$(curl -s -XGET "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&p=$pageNumber&ps=$PAGE_SIZE" | jq '.issues[]') # 用--argjson把bash变量传入jq内部,名称和表达式内的变量对应 jq --argjson addItem "$currentIssuesArr" '.issues[.issues| length] += $addItem' "$FILE_REPORT_RESULT" > tmp.json && mv tmp.json "$FILE_REPORT_RESULT" done
如果需要一次性追加单页所有issue到数组,可以简化写法,效率更高:
for (( pageNumber=$page; pageNumber<=$countPages; pageNumber++ )) do currentIssuesArr=$(curl -s -XGET "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&p=$pageNumber&ps=$PAGE_SIZE" | jq '.issues') jq --argjson addItems "$currentIssuesArr" '.issues += $addItems' "$FILE_REPORT_RESULT" > tmp.json && mv tmp.json "$FILE_REPORT_RESULT" done
如果不需要修改原文件,只需要输出到test.json,将代码里的重定向和mv逻辑改为> test.json即可。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

