A retry loop should have a clear maximum so automation can recover from transient failures without running forever.

Program

Play the script to choose the maximum attempt count and watch the loop stop when the modeled action succeeds.

max_attempts
retry_loop.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash

max_attempts=2
attempt=1
result="pending"
while [ "$attempt" -le "$max_attempts" ]; do
    if [ "$attempt" -eq "$max_attempts" ]; then
        result="ok"
        break
    else
        attempt=$((attempt + 1))
    fi
done
echo "attempts=$attempt result=$result"
#!/usr/bin/env bash

max_attempts=3
attempt=1
result="pending"
while [ "$attempt" -le "$max_attempts" ]; do
    if [ "$attempt" -eq "$max_attempts" ]; then
        result="ok"
        break
    else
        attempt=$((attempt + 1))
    fi
done
echo "attempts=$attempt result=$result"
  1. max_attempts ← 2

    3max_attempts=24attempt=1
    values this step2max_attempts
  2. attempt ← 1

    3max_attempts=24attempt=15result="pending"
    values this step1attempt
  3. result ← pending

    4attempt=15result="pending"6while [ "$attempt" -le "$max_attempts" ]; do
    values this steppendingresult
  4. while [ "$attempt" -le "$max_attempts" ]; do

    5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then
    values this step1attempt2max_attempts
  5. if [ "$attempt" -eq "$max_attempts" ]; then

    6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then8        result="ok"
    values this step1attempt2max_attempts
  6. attempt ← 2

    10else11    attempt=$((attempt + 1))12fi
    values this step2attempt
  7. while [ "$attempt" -le "$max_attempts" ]; do

    5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then
    values this step2attempt2max_attempts
  8. if [ "$attempt" -eq "$max_attempts" ]; then

    6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then8        result="ok"
    values this step2attempt2max_attempts
  9. result ← ok

    7if [ "$attempt" -eq "$max_attempts" ]; then8    result="ok"9    break
    values this stepokresult
  10. loop ← break

    8    result="ok"9    break10else
    values this stepbreakloop
  11. echo "attempts=$attempt result=$result"

    13done14echo "attempts=$attempt result=$result"
    outputattempts=2 result=ok
    values this step2attemptokresult
  1. max_attempts ← 3

    3max_attempts=34attempt=1
    values this step3max_attempts
  2. attempt ← 1

    3max_attempts=34attempt=15result="pending"
    values this step1attempt
  3. result ← pending

    4attempt=15result="pending"6while [ "$attempt" -le "$max_attempts" ]; do
    values this steppendingresult
  4. while [ "$attempt" -le "$max_attempts" ]; do

    5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then
    values this step1attempt3max_attempts
  5. if [ "$attempt" -eq "$max_attempts" ]; then

    6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then8        result="ok"
    values this step1attempt3max_attempts
  6. attempt ← 2

    10else11    attempt=$((attempt + 1))12fi
    values this step2attempt
  7. while [ "$attempt" -le "$max_attempts" ]; do

    5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then
    values this step2attempt3max_attempts
  8. if [ "$attempt" -eq "$max_attempts" ]; then

    6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then8        result="ok"
    values this step2attempt3max_attempts
  9. attempt ← 3

    10else11    attempt=$((attempt + 1))12fi
    values this step3attempt
  10. while [ "$attempt" -le "$max_attempts" ]; do

    5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then
    values this step3attempt3max_attempts
  11. if [ "$attempt" -eq "$max_attempts" ]; then

    6while [ "$attempt" -le "$max_attempts" ]; do7    if [ "$attempt" -eq "$max_attempts" ]; then8        result="ok"
    values this step3attempt3max_attempts
  12. result ← ok

    7if [ "$attempt" -eq "$max_attempts" ]; then8    result="ok"9    break
    values this stepokresult
  13. loop ← break

    8    result="ok"9    break10else
    values this stepbreakloop
  14. echo "attempts=$attempt result=$result"

    13done14echo "attempts=$attempt result=$result"
    outputattempts=3 result=ok
    values this step3attemptokresult
retry A retry loop repeats an operation after a failed attempt.
maximum The maximum attempt count prevents an infinite loop.
break `break` exits the loop immediately after success.