#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: until [-m MAX] [-n SECONDS] [-q] COMMAND... EOF } _SECONDS=5 QUIET=false while getopts 'm:n:q' flag; do case "$flag" in (m) MAX="$OPTARG" ;; (n) _SECONDS="$OPTARG" ;; (q) QUIET=true ;; (*) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) ATTEMPT=1 while true; do if [ "$QUIET" = false ]; then printf 'Attempt %s.\n' "$ATTEMPT" >&2 fi ATTEMPT=$((ATTEMPT + 1)) if "$@"; then break fi if [ -n "${MAX:-}" ] && [ "$ATTEMPT" -gt "$MAX" ]; then printf 'Maximum number of attempts reached: %s.\n' "$MAX" >&2 exit 1 fi sleep "$_SECONDS" done