想要在函数中重试命令。为了测试,我写了错误的命令 ( 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 永远不会越过$CMD
内部RETRY
。您的两个函数互相调用,它们堆叠得越来越多;它们都没有真正退出。
我认为你的整个方法都是有缺陷的。我不知道确切的目的是什么,但为了“尝试有限次数的命令”,这可能是你的出发点:
(max=5; for n in `seq 1 $max`; do your_command && break; done)
子 shell 用于退出$max
当前 shell。请注意,整个命令返回相当合理的退出代码。