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."

おすすめ記事