Я пробовал экспоненциальный алгоритм отката с помощью оболочки. Но когда я передаю параметр pending, он запускает бесконечный цикл
#!/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
Есть идеи?
sleep $(( 1^$retries * 1))
Скорее всего, это не то, что вам нужно. ^
— это побитовое xor, так что вы получите, ну, 1, 0, 3, 2 и т. д. Возведение в степень равно **
. А также, конечно, 1**X
— это просто 1
, а X*1
— это просто X
, но вы, вероятно, имели в виду исправить константы позже.
Единственный способ выйти из цикла — $status
иметь значение success
. Это связано с тем, что результатом присваивания будет истинное значение в начале цикла, и цикл будет бесконечным.
Ваш цикл:
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."