![将代码循环转换为函数](https://linux22.com/image/45722/%E5%B0%86%E4%BB%A3%E7%A0%81%E5%BE%AA%E7%8E%AF%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%87%BD%E6%95%B0.png)
我想以 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 中开箱即用。