You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:11:14