在 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(因为$CMD)再次运行,我们可以从头开始解释。

Bash 永远不会越过$CMD内部RETRY。您的两个函数互相调用,它们堆叠得越来越多;它们都没有真正退出。


我认为你的整个方法都是有缺陷的。我不知道确切的目的是什么,但为了“尝试有限次数的命令”,这可能是你的出发点:

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

子 shell 用于退出$max当前 shell。请注意,整个命令返回相当合理的退出代码。

相关内容