Попытка выполнить команды в bash ограниченное количество раз

Попытка выполнить команды в bash ограниченное количество раз

Хотел повторить команду в функции. Для тестирования я написал неправильную команду ( 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

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

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

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


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

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

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

Связанный контент