while 루프는 쉘의 조건을 확인하지 않습니다

while 루프는 쉘의 조건을 확인하지 않습니다

쉘의 지수 백오프 알고리즘을 사용하려고 합니다. 그런데 보류 중인 매개변수를 매개변수로 전달하면 끝없는 루프가 실행됩니까?

#!/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아마도 나중에 상수를 수정하려고 할 것입니다.

관련 정보