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

Roy*_*Roy 33 bash

我想创建一个循环,如果它返回错误,则重复 ncftp 传输。

我有点不确定如何在循环中使用退出代码变量。这样的东西会起作用吗?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done
Run Code Online (Sandbox Code Playgroud)

Roy*_*Roy 55

我在 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
Run Code Online (Sandbox Code Playgroud)

  • Oneliner:`直到命令;做 :; 完成` (6认同)

Dan*_*ley 11

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

您可能还想sleep在那里吊索一个以阻止它过快地重生。

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


Qwe*_*tie 5

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

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry
Run Code Online (Sandbox Code Playgroud)