쉘의 지수 백오프 알고리즘을 사용하려고 합니다. 그런데 보류 중인 매개변수를 매개변수로 전달하면 끝없는 루프가 실행됩니까?
#!/bin/bash
MAX_RETRIES=5
retries=0
status=$1
while [ $retries -le $MAX_RETRIES ];
#while
echo $retries
retries=$(( $retries + 1 ))
do
sleep $(( 1^$retries* 1))
if [[ "$status" == "success" ]]; then
echo "success"
break;
elif [[ "$status" == "pending" ]]; then
echo "pending"
else
echo "I am else."
fi
echo "Retries in do $retries"
echo "after do"; done
어떤 아이디어가 있나요?
답변1
루프에서 벗어나는 유일한 방법은 for $status
입니다 success
. 이는 루프 헤더의 할당 결과가 true가 되고 루프가 무한해지기 때문입니다.
귀하의 루프:
while [ some test ]; echo 'something'; retries=$(( $retries + 1 )); do
loop body
done
대신 echo
및 할당을 루프로 이동하세요.
#!/bin/bash
MAX_RETRIES=5
retries=0
status="$1"
while [ "$retries" -le "$MAX_RETRIES" ]; do
echo "$retries"
retries=$(( retries + 1 ))
sleep $(( 1^retries * 1))
if [[ "$status" == "success" ]]; then
echo "success"
break;
elif [[ "$status" == "pending" ]]; then
echo "pending"
else
echo "I am else."
fi
echo "Retries in do $retries"
done
echo "done."
또는 다음을 사용하여 case .. esac
:
#!/bin/bash
MAX_RETRIES=5
retries=0
status="$1"
while [ "$retries" -le "$MAX_RETRIES" ]; do
echo "$retries"
retries=$(( retries + 1 ))
sleep $(( 1^retries * 1))
case "$status" in
success)
echo "success"
break ;;
pending)
echo "pending" ;;
esac
echo "Retries in do $retries"
done
echo "done."
답변2
sleep $(( 1^$retries * 1))
이는 원하는 효과를 얻지 못할 수도 있습니다.^
비트 XOR입니다, 그래서 당신은 음, 음, 1,0,3,2 등을 얻게 될 것입니다...지수는 입니다 **
. 물론, 그것은 1**X
단지 1
, 그리고 X*1
단지 이지만 X
아마도 나중에 상수를 수정하려고 할 것입니다.