简体   繁体   中英

how to use loop with some conditions in shell script

I need to run a curl command several times, and check the result every time. I used a for loop to check the output from curl , and I want to exit the loop when the correct status is reached.

The very first time the curl command is run, it will show me this output:

{
  "name": "organizations/org_name/operations/long_running_operation_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.apigee.v1.OperationMetadata",
    "operationType": "INSERT",
    "targetResourceName": "organizations/org_name",
    "state": "IN_PROGRESS"
  }
}

It takes time to complete, that's why it says IN_PROGRESS . It took around 30 to 60 sec, and if we run the same curl command after 30 to 60 sec then it will show the output below:

{
  "error": {
    "code": 409,
    "message": "org graceful-path-310004 already associated with another project",
    "status": "ALREADY_EXISTS",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.RequestInfo",
        "requestId": "11430211642328568827"
      }
    ]
  }
}

Here is the script I have so far:

test=$(curl -H "Authorization: Bearer $TOKEN" -X POST -H "content-type:application/json" \
  -d '{
    "name":"'"$ORG_NAME"'",
    "displayName":"'"$ORG_DISPLAY_NAME"'",
    "description":"'"$ORGANIZATION_DESCRIPTION"'",
    "runtimeType":"'"$RUNTIMETYPE"'",
    "analyticsRegion":"'"$ANALYTICS_REGION"'"
  }' \
          "https://apigee.googleapis.com/v1/organizations?parent=projects/$PROJECT_ID" | jq '.error.status')
echo $test
while [ $test = "ALREADY EXISTS" ||  $test != "IN_PROGRESS"  ]
do
        echo $test
        echo "Organization is creating"
        test=$(curl -H "Authorization: Bearer $TOKEN" -X POST -H "content-type:application/json" \
  -d '{
    "name":"'"$ORG_NAME"'",
    "displayName":"'"$ORG_DISPLAY_NAME"'",
    "description":"'"$ORGANIZATION_DESCRIPTION"'",
    "runtimeType":"'"$RUNTIMETYPE"'",
    "analyticsRegion":"'"$ANALYTICS_REGION"'"
  }' \
          "https://apigee.googleapis.com/v1/organizations?parent=projects/$PROJECT_ID" | jq '.error.status')
done
echo "exit from loop"

To reduce the duplicated code, use functions.

Also, best practice to use jq to generate json -- it will safely handle any embedded quotes in the data:

json() {
    jq  --arg name "$ORG_NAME" \
        --arg displayName "$ORG_DISPLAY_NAME" \
        --arg description "$ORGANIZATION_DESCRIPTION" \
        --arg runtimeType "$RUNTIMETYPE" \
        --arg analyticsRegion "$ANALYTICS_REGION" \
        --null-input --compact-output \
        '$ARGS.named'
}

errorStatus() {
    curl -H "Authorization: Bearer $TOKEN" \
         -X POST \
         -H "content-type:application/json" \
         -d "$(json)" \
          "${URL}?parent=projects/$PROJECT_ID" \
    | jq -r '.error.status'
}

while true; do
    status=$(errorStatus)
    [ "$status" = "ALREADY EXISTS" ] && break
done

echo "exit from loop"

The while true; do some code; condition && break; done while true; do some code; condition && break; done while true; do some code; condition && break; done bit is the bash version of a do-while loop

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM