在 bash 中重试一系列命令有限次数

sor*_*rin 6 bash

我正在寻找一种漂亮而干净的方法来在 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)

每个命令都可能失败,我宁愿停止运行下一个命令,而只执行重试代码。

sec*_*ive 8

多年来,我针对这种情况提出了以下“核心”循环:

(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)


anu*_*ava 4

像这样的东西:

#!/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)