コードループを関数に変換

コードループを関数に変換

20秒間隔で5回コマンドを再試行したいです。このコマンドをメソッドパラメータとして渡したいと思います。どうすればいいですか?関数が作成されたら、値を関数に渡すにはどうすればよいですか?

現在のコードをパラメータセットを持つ関数に変換したいと思います。シェルスクリプトでこの関数をどのように作成して呼び出すのですか?

私の現在のコードは次のとおりです。

  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
}

おすすめ記事