如何在Bash脚本中迭代jq命令的JSON输出结果?
解决Bash中用jq解析测试矩阵JSON的字段提取与迭代问题
问题根源
你之前的jq命令输出的是多个独立的JSON对象,没有被包裹成数组,也没有逗号分隔,导致Bash无法直接按数组迭代。以下是两种实用的解决思路:
方案1:输出合法的JSON数组(方便后续JSON处理)
如果需要得到一个完整的、可被其他工具解析的JSON数组,用[]将提取的对象包裹起来:
jq '[.[] | {matrixId, state, details, device, webLink}]' test_matrix.json
这个命令会把所有提取的对象组合成一个标准JSON数组,自动添加逗号分隔符。
方案2:直接在Bash中迭代每个对象(更高效)
如果要直接在脚本里循环处理每个测试项,用-c参数让jq每行输出一个JSON对象,再配合Bash的while循环读取:
# 循环读取每个JSON对象 while read -r item; do # 提取单个字段(-r参数输出原始字符串,不带引号) matrixId=$(echo "$item" | jq -r '.matrixId') state=$(echo "$item" | jq -r '.state') details=$(echo "$item" | jq -r '.details') device=$(echo "$item" | jq -r '.device') webLink=$(echo "$item" | jq -r '.webLink') # 这里写你的业务逻辑,比如打印或处理字段 echo "测试项ID: $matrixId,状态: $state,设备: $device" done < <(jq -c '.[] | {matrixId, state, details, device, webLink}' test_matrix.json)
更高效的字段提取方式
避免多次调用jq,直接让jq把字段格式化为Bash可直接读取的字符串(用@sh转义特殊字符):
jq -r '.[] | [.matrixId, .state, .details, .device, .webLink] | @sh' test_matrix.json | while read -r matrixId state details device webLink; do echo "测试详情: $details" echo "查看链接: $webLink" done
内容的提问来源于stack exchange,提问作者ziad_tawfeek
相关产品推荐
相关产品推荐

