我正在寻找一种漂亮而干净的方法来在 bash 中实现重试循环机制。
这是应该如何工作的:
retries = 3
while retries:
cmd1
cmd2
cmd3
if not_error:
break
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60
retries --
if retries = 0:
exit "Failed!"
Run Code Online (Sandbox Code Playgroud)
每个命令都可能失败,我宁愿停止运行下一个命令,而只执行重试代码。
多年来,我针对这种情况提出了以下“核心”循环:
(r=3;while ! some_cmd ; do ((--r))||exit;sleep 60;done)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是逻辑独立于单个语句中,如果命令成功,则表达式将计算为 true,如果在 3 次尝试后未成功,则表达式将计算为 false。如果您正在运行set -e或使用该命令的多次重试来替换现有的简单命令,这非常有用。
在你的情况下,这可以转化为:
if ! (r=3; while ! { cmd1 && cmd2 && cm3 ; } ; do
((--r)||exit
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60;done) ; then
echo "Failed!"
exit 1
fi
echo "Passed!"
exit 0
Run Code Online (Sandbox Code Playgroud)
像这样的东西:
#!/bin/bash
retries=3
for ((i=0; i<retries; i++)); do
cmd1 && cmd2 && cmd3
[[ $? -eq 0 ]] && break
echo "something went wrong, let's wait 60 seconds and retry"
sleep 60
done
(( retries == i )) && { echo 'Failed!'; exit 1; }
exit 0
Run Code Online (Sandbox Code Playgroud)