将代码循环转换为函数

将代码循环转换为函数

我想以 20 秒的间隔重试某个命令 5 次。我希望将此命令作为方法参数传递。怎么做?一旦函数编写完成,如何将值传递给函数?

我希望将当前代码转换为带有一组参数的函数。如何在我的 shell 脚本中编写和调用这个函数?

我当前的代码是这样的:

  trialNumber=0
    until [ $trialNumber -ge 5]  
     do
        ssh $USERID@$HOST $SCRIPT_LOCATION/runme.sh   # This line is my command and it may very with number of parameters or command itself.
       [ $? -eq 0 ] && break
      trialNumber=$[$trialNumber+1]
      sleep 20
   done

(上面的代码嵌入在很多地方,我想将其移动到函数中)。

答案1

retry() {
  trialNumber=$1 delay=$2; shift 2
  while [ "$trialNumber" -gt 0 ]; do
    "$@" && return
    ret=$?
    sleep "$delay"
    trialNumber=$(($trialNumber - 1))
  done
  return "$ret"
}

retry 5 20 ssh "$USERID@$HOST" "$SCRIPT_LOCATION/runme.sh"

尽管最后一个sleep以防万一失败是不必要的。可能会更好,如:

retry() {
  trialNumber=$1 delay=$2; shift 2
  until "$@"; do
    ret=$?
    trialNumber=$(($trialNumber - 1))
    [ "$trialNumber" -gt 0 ] || return "$ret"
    sleep "$delay"
  done
}

答案2

使用重试命令。

~$ retry --times 5 --delay 20 -- ssh $USERID@$HOST $SCRIPT_LOCATION/runme.sh

https://github.com/minfrin/retry

在最新的 Debian、Ubuntu 和 Nix 中开箱即用。

相关内容