Practical Automation Patterns
Retry Loop
Bound Repeated Attempts
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.
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"
max_attempts ← 2
3max_attempts=24attempt=1values this step2max_attemptsattempt ← 1
3max_attempts=24attempt=15result="pending"values this step1attemptresult ← pending
4attempt=15result="pending"6while [ "$attempt" -le "$max_attempts" ]; dovalues this steppendingresultwhile [ "$attempt" -le "$max_attempts" ]; do
5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; thenvalues this step1attempt2max_attemptsif [ "$attempt" -eq "$max_attempts" ]; then
6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; then8 result="ok"values this step1attempt2max_attemptsattempt ← 2
10else11 attempt=$((attempt + 1))12fivalues this step2attemptwhile [ "$attempt" -le "$max_attempts" ]; do
5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; thenvalues this step2attempt2max_attemptsif [ "$attempt" -eq "$max_attempts" ]; then
6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; then8 result="ok"values this step2attempt2max_attemptsresult ← ok
7if [ "$attempt" -eq "$max_attempts" ]; then8 result="ok"9 breakvalues this stepokresultloop ← break
8 result="ok"9 break10elsevalues this stepbreakloopecho "attempts=$attempt result=$result"
13done14echo "attempts=$attempt result=$result"outputattempts=2 result=okvalues this step2attemptokresult
max_attempts ← 3
3max_attempts=34attempt=1values this step3max_attemptsattempt ← 1
3max_attempts=34attempt=15result="pending"values this step1attemptresult ← pending
4attempt=15result="pending"6while [ "$attempt" -le "$max_attempts" ]; dovalues this steppendingresultwhile [ "$attempt" -le "$max_attempts" ]; do
5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; thenvalues this step1attempt3max_attemptsif [ "$attempt" -eq "$max_attempts" ]; then
6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; then8 result="ok"values this step1attempt3max_attemptsattempt ← 2
10else11 attempt=$((attempt + 1))12fivalues this step2attemptwhile [ "$attempt" -le "$max_attempts" ]; do
5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; thenvalues this step2attempt3max_attemptsif [ "$attempt" -eq "$max_attempts" ]; then
6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; then8 result="ok"values this step2attempt3max_attemptsattempt ← 3
10else11 attempt=$((attempt + 1))12fivalues this step3attemptwhile [ "$attempt" -le "$max_attempts" ]; do
5result="pending"6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; thenvalues this step3attempt3max_attemptsif [ "$attempt" -eq "$max_attempts" ]; then
6while [ "$attempt" -le "$max_attempts" ]; do7 if [ "$attempt" -eq "$max_attempts" ]; then8 result="ok"values this step3attempt3max_attemptsresult ← ok
7if [ "$attempt" -eq "$max_attempts" ]; then8 result="ok"9 breakvalues this stepokresultloop ← break
8 result="ok"9 break10elsevalues this stepbreakloopecho "attempts=$attempt result=$result"
13done14echo "attempts=$attempt result=$result"outputattempts=3 result=okvalues 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.