如何修改Shell脚本以获取API完整响应及测试状态
问题描述
我有一个GET请求的API端点:
https://test.cloudnetwork/devops/api/status?over=658xx899xxx68sspo
它返回的JSON响应包含test2、test4、test5等多个测试节点,每个节点都带有FAILED、PASSED这类状态,后续还会新增test6、test7这类节点。我写了一段Shell脚本,目前只能打印部分响应,想修改脚本实现:获取完整API响应,并且展示所有测试节点的FAILED/PASSED/SUCCESSFULLY状态。原脚本如下:
if [ "$WAIT_FOR_COMPLETION" == "true" ]; then echo "My message to complete..." test4.1="PROCESSING" while [[ "$test4.1" == "PROCESSING" ]]; do TEST_STATUS=$(curl -s --location --request GET "https://test.cloudnetwork/devops/api/status?over=$OVER_ID" \ --header "Authorization: Bearer $ACCESS_TOKEN") echo "" test1=$(echo "$TEST_STATUS" | jq -r '.errorsDetected[]') TEST=$(echo "$TEST_STATUS" | jq -r '.test4') test4.1=$(echo "$test4" | jq -r '.status') if [ "$test4.1" == "FAILED" ]; then test4.1=$(echo "$TEST_STATUS" | jq -r '.test4.test4.1') echo " " echo "Test Status: $STATUS" if [ -z "$TEST_4" ] || [ "$TEST_4" == "null" ]; then echo "Build failed test4.1. $TEST_4" exit 1 fi fi done # Once the status is no longer "PROCESSING," assume it completed echo "my message completed successfully!" else echo "my message failed" exit 1 fi
修改后的脚本
if [ "$WAIT_FOR_COMPLETION" == "true" ]; then echo "等待测试完成..." while true; do # 获取完整API响应 TEST_STATUS=$(curl -s --location --request GET "https://test.cloudnetwork/devops/api/status?over=$OVER_ID" \ --header "Authorization: Bearer $ACCESS_TOKEN") # 打印完整响应(可选,调试用) echo "=== 当前完整API响应 ===" echo "$TEST_STATUS" | jq '.' echo "=======================" # 遍历所有测试节点(自动适配test2/test4/test5/test6等) echo "=== 各测试节点状态 ===" FAILED_COUNT=0 # 提取所有test开头的节点及其状态 echo "$TEST_STATUS" | jq -r 'to_entries[] | select(.key | startswith("test")) | "\(.key): \(.value.status)"' | while read -r LINE; do echo "$LINE" # 统计失败节点数量 if echo "$LINE" | grep -q "FAILED"; then FAILED_COUNT=$((FAILED_COUNT + 1)) fi done # 检查是否存在失败节点,有则直接退出 if [ "$FAILED_COUNT" -gt 0 ]; then echo "发现测试失败,终止执行" exit 1 fi # 检查是否还有处于PROCESSING状态的节点 HAS_PROCESSING=$(echo "$TEST_STATUS" | jq -r 'any(.[] | select(.key | startswith("test")); .status == "PROCESSING")') if [ "$HAS_PROCESSING" == "false" ]; then echo "所有测试已完成!" break fi # 间隔10秒再轮询,避免频繁请求API sleep 10 done else echo "未开启等待完成模式,终止执行" exit 1 fi
关键改动说明
- 完整响应获取与展示:保留完整API响应并打印(可选调试用),确保能看到所有返回内容
- 自动适配所有测试节点:用
jq筛选所有以test开头的顶级键,无需手动修改脚本适配新增的test6/test7等节点 - 状态检查逻辑优化:
- 统计所有FAILED节点,一旦发现失败立即退出
- 检查是否还有PROCESSING节点,无则结束循环
- 修复原脚本问题:修正了变量名混乱、未定义变量等错误,新增
sleep减轻服务器请求压力
内容的提问来源于stack exchange,提问作者cloudnetwork
相关产品推荐
相关产品推荐

