bash脚本:如果返回错误,则重复命令


Answers:


40

我在serverfault的其他地方找到了这种优雅循环的基础。事实证明,无需保存退出代码,因为您可以直接在命令本身上进行测试。

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

几乎。您最好将返回值保存为变量,以便可以在循环之前对其进行预设。否则它将受到最后运行的命令的影响。

您可能还希望将a悬吊sleep在其中以阻止其重新生成太快。

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

我认为忘记了将退出代码传递给RET变量,但是我明白了。我的主要问题是,何时才会对直到子句进行求值?在C语言中,直到第一次运行循环后才对其进行评估,在这种情况下,我的循环应该可以工作。不过,您仍然更好,因为它允许诸如睡眠之类的中间命令。谢谢!
罗伊,

好眼力。我已经编辑了 该子句将在第一次运行之前进行评估。因此,以前它将使用任何先前命令的返回码。Bash并不强制使用double-equals,但是使用它是一种很好的做法。
丹·卡利

==是用于字符串相等而不是数字,尽管在这种情况下我认为这并不重要...
Kyle Brandt

单和双等于是相同的。但是,现在您提到整数整数将更好。
丹·卡利

1
您无需测试返回代码编号-您可以测试程序本身的返回代码-直到程序; 睡觉3; 完成。
克里斯,

3

有点hacky,但是我的解决方案是创建一个bash函数,如果该函数失败退出,该函数将自行运行

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.