Bash操作JSON时无法将条目添加到issues数组末尾,部分条目出现在数组外
问题原因分析与解决方案
核心问题原因
- 字符串处理JSON的不稳定性:你通过
${currentIssuesArr:1:${#currentIssuesArr}-2}手动剥除数组首尾方括号的方式,强依赖jq的输出格式完全固定,一旦接口返回的issue内容包含转义方括号、或者jq输出带首尾换行/空格,切片后的内容就会出现JSON语法错误,导致后续解析结构错乱。就算你确认切片得到的内容正确,后续步骤依然存在问题。 - Shell变量注入jq的语法风险:你把处理后的
resultIssues直接拼接到jq表达式中,如果resultIssues包含双引号、空格、换行、jq语法特殊字符,Shell会先做分词、特殊字符转义处理,导致jq拿到的表达式本身就存在语法错误,自然会出现内容错位、条目写到数组外的问题。 - jq数组追加逻辑错误:你使用的
.issues[.issues| length] |= . + $resultIssues逻辑本身不符合要求:这个表达式的含义是「给现有issues数组的最后一个元素追加值」,而不是「给issues数组追加新元素」。当你传入多个逗号分隔的JSON对象时,jq会解析失败,多出来的元素会被当成顶层内容直接写到数组外层,正好匹配你遇到的现象。
修复方案
完全放弃手动处理JSON字符串的操作,直接使用jq原生的数组合并能力+安全的变量传参方式即可:
#!/bin/bash for (( pageNumber=1; pageNumber<=$COUNT_PAGES; pageNumber++ )) do # 拉取当前页完整的issues数组,不做字符串处理 new_issues=$(curl -s -XGET "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&p=$pageNumber&ps=$PAGE_SIZE" | jq '.issues') # 用--argjson安全传入JSON变量,直接合并数组,通过临时文件避免原文件损坏 jq --argjson add_items "$new_issues" '.issues += $add_items' "$FILE_REPORT" > "$FILE_REPORT.tmp" && mv "$FILE_REPORT.tmp" "$FILE_REPORT" done
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

