シェルの指数バックオフアルゴリズムを使用しようとしています。しかし、保留中のパラメータをパラメータとして渡すと、無限ループが実行されますか?
#!/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
、おそらく後で定数を修正しようとします。