在 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被呼叫。然後(從 的內部RETRYLIST(as $CMD) 再次運行,我們可以從頭開始解釋。

Bash 永遠無法進入$CMD內部RETRY。你的兩個函數互相調用,它們的堆疊越來越多;他們沒有一個真正存在。


我認為你的整個方法都是有缺陷的。我不知道確切的目的是什麼,但要“嘗試有限次數的命令”,這可能是您的起點:

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

子 shell 用於封鎖$max目前 shell。請注意,整個命令會傳回相當正常的退出代碼。

相關內容