diff options
Diffstat (limited to '.local/bin/loop')
-rwxr-xr-x | .local/bin/loop | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/.local/bin/loop b/.local/bin/loop new file mode 100755 index 0000000..d3dccc7 --- /dev/null +++ b/.local/bin/loop @@ -0,0 +1,45 @@ +#!/bin/sh + +help() { + echo "loop - execute command in loop + +USAGE: + loop [OPTION]... <COMMAND> + +OPTIONS: + -n INTERVAL sleep for given INTERVAL time between loops + all arguments of \`sleep\` command are valid + -c COUNT maximum count of loops (default: 1000) + -s clear screen for every execution + -q quiet, redirect output to /dev/null + -h show this help message + +ENVIRONMENT VARIABLES: + LOOP_INTERVAL set INTERVAL time + MAX_LOOP_COUNT set loop COUNT" +} + +err() { printf 'loop: %s\n' "$@" >&2; exit 1; } + +while getopts 'sc:n:qh' o; do case "$o" in + s) cflag=1 ;; + n) export LOOP_INTERVAL="$OPTARG" ;; + c) export MAX_LOOP_COUNT="$OPTARG" ;; + q) qflag=1 ;; + h) help; exit ;; + *) err "invalid option -- $OPTARG" ;; +esac done +shift $((OPTIND - 1)) + +[ "$#" -lt 1 ] && err "no COMMAND given" +cmds="$*" +max_count="${MAX_LOOP_COUNT:-1000}" +[ -n "$LOOP_INTERVAL" ] && cmds="$cmds; sleep '$LOOP_INTERVAL'" +[ "$cflag" = 1 ] && cmds="clear; $cmds" +[ "$qflag" = 1 ] && cmds="$cmds >/dev/null" + +for count in $(seq "$max_count"); do + eval "$cmds" || break +done + +[ "$count" -ge "$max_count" ] && err "reached max loop COUNT: $max_count" |