使用jq对比JSON对象失败:Shell脚本执行异常排查
问题原因与修复方案
核心问题:变量中的JSON格式不合法且与文件结构不匹配
你的脚本执行失败的根本原因是RESPONSE变量里的内容不是标准JSON,和expectedTestResponse1.json里的合法JSON存在多处结构/语法差异:
- 对象键未加双引号:JSON语法强制要求所有对象的键必须用双引号包裹,比如
remoteIds、remoteId、requestsReceived在你的变量里都没有引号,而文件中这些键都是带双引号的。jq作为严格的JSON解析工具,会直接拒绝这种不合法的输入。 - remoteId的值类型不匹配:变量里的
remoteId:[fd00:...--(...)]是把值声明为数组,但文件里的remoteId是字符串类型(被双引号包裹的"[fd00:...--(...)]"),两种类型完全无法匹配。 - 额外语法错误:变量里的数组元素分隔、结构嵌套也存在格式问题,进一步导致jq解析失败。
修复后的脚本
将RESPONSE变量修改为合法的JSON格式,确保键名带双引号、值类型与文件一致:
RESPONSE='{ "remoteIds": [ {"remoteId": "[fd00:10:244:3:0:0:0:14]--(http://fd00-10-244-3--14.scctest.pod:8080)", "requestsReceived": 1}, {"remoteId": "[fd00:10:244:3:0:0:0:14]--(http://fd00-10-244-3--14.scctest.pod:8081)", "requestsReceived": 1}, {"remoteId": "[fd00:10:244:3:0:0:0:14]--(http://fd00-10-244-3--14.scctest.pod:8082)", "requestsReceived": 1}, {"remoteId": "[fd00:10:244:3:0:0:0:14]--(http://fd00-10-244-3--14.scctest.pod:8083)", "requestsReceived": 1} ] }' expected_response='/test/scripts/tests/local-policy/expectedTestResponse1.json' # 对比JSON对象 if jq --argjson var "$RESPONSE" -e '. == $var' "$expected_response" > /dev/null 2>&1; then echo 0 # JSON内容一致 else echo 1 # JSON内容不一致 exit 1 fi
验证方法
修改后可以先单独检查RESPONSE的JSON合法性:
echo "$RESPONSE" | jq .
如果能正常输出格式化后的JSON,说明格式没问题,此时再执行脚本就能得到预期的0输出。
内容的提问来源于stack exchange,提问作者Starbucks Admin
相关产品推荐
相关产品推荐

