While loop não verificando a condição no shell

0

Eu estava tentando o algoritmo de backoff exponencial com o shell. Mas quando estou passando o pendente como parâmetro, ele está executando o loop never ending?

#!/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

Alguma ideia?

    
por Mohit Kumar 16.06.2017 / 11:26

2 respostas

1

A única maneira de sair do loop é que $status seja success . Isso ocorre porque o resultado da atribuição será verdadeiro na cabeça do loop e o loop será infinito.

Seu loop:

while [ some test ]; echo 'something'; retries=$(( $retries + 1 )); do
    loop body
done

Em vez disso, mova a echo e a atribuição para o loop:

#!/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."

Ou com 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."
    
por 16.06.2017 / 11:34
1
sleep $(( 1^$retries * 1))

Isso provavelmente não faz o que você quer. ^ é bitwise xor , então você teria hum, bem, 1, 0, 3, 2, etc ... A exponenciação é ** . E também, é claro, 1**X é apenas 1 e X*1 é apenas X , mas você provavelmente estava querendo corrigir as constantes mais tarde.

    
por 16.06.2017 / 14:40

Tags