Хотел повторить команду в функции. Для тестирования я написал неправильную команду (lsss). Он должен попытаться 5 раз и потерпеть неудачу, но он застрял в бесконечном цикле.

#!/bin/bash

RETRY () {

        Attempt=0
        Max_Attempts=5
        CMD=$1
        while [ $Attempt -lt $Max_Attempts ]
        do
            $CMD

        if [ $? -eq 0 ]; then
           echo "succeeded on Attempt $Attempt" >> /tmp/err.txt
            break
        else
                 Attempt=$( expr $Attempt + 1 )
        echo  "Command failed. Attempting  $Attempt/$Max_Attempts" >> /tmp/err.txt
                 sleep 2
        fi
done

}

LIST () {

        lsss  # COMMAND WRITTEN WRONGLY FOR TESTING

        if [ $? -eq 0 ]; then
         echo "SUCCESS" 
        else
        RETRY LIST

        echo "FAILED" 
        fi
}
LIST

1 ответ1

0

Там нет вопроса в вашем "вопрос". Я предполагаю, что вопрос «почему?».

Всякий раз, когда LIST запускается, lsss не выполняется, поэтому RETRY LIST . Затем (изнутри RETRY) LIST (как $CMD) запускается снова, и мы можем объяснить с самого начала.

Bash никогда не преодолеет $CMD внутри RETRY . Ваши две функции вызывают друг друга, они складываются все больше и больше; ни один из них действительно не выходит.


Я думаю, что весь ваш подход несовершенен. Я не знаю, какова точная цель, но "попробовать команду ограниченное количество раз", это может быть вашей отправной точкой:

(max=5; for n in `seq 1 $max`; do your_command && break; done)

Подоболочка используется, чтобы держать $max вне текущей оболочки. Обратите внимание, что вся команда возвращает вполне нормальный код выхода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .