Пока цикл не проверяет условие в shell

Я пробовал экспоненциальный алгоритм отката с помощью оболочки. Но когда я передаю параметр 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

Есть идеи?

0
16.06.2017, 12:26
2 ответа
sleep $(( 1^$retries * 1))

Скорее всего, это не то, что вам нужно. ^ — это побитовое xor, так что вы получите, ну, 1, 0, 3, 2 и т. д. Возведение в степень равно **. А также, конечно, 1**X — это просто 1, а X*1 — это просто X, но вы, вероятно, имели в виду исправить константы позже.

1
28.01.2020, 02:33

Единственный способ выйти из цикла — $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."
1
28.01.2020, 02:33

Теги

Похожие вопросы