1
0
Fork 0
mirror of https://github.com/notwa/rc synced 2024-11-05 02:39:03 -08:00
rc/sh/argc

62 lines
1.5 KiB
Bash
Executable file

#!/usr/bin/env sh
# YES_ZSH
# YES_BASH
# YES_DASH
# YES_ASH
argc() { ### @- validate the number of arguments in a function.
### ```sh
### # usage: myfunc() { argc -(eq|le|ge) [0-9] "$0" "$@" || return; }
###
### myfunc() {
### # use one of the following:
### argc -eq N "$0" "$@" || return
### argc -le N "$0" "$@" || return
### argc -ge N "$0" "$@" || return
### # where N is an integer between 0 and 9.
### }
### ```
# local usage='usage: myfunc() { %s -(eq|lt|gt|le|ge) [0-9] "$0" "$@" || return; }\n'
local usage='usage: myfunc() { %s -(eq|le|ge) [0-9] "$0" "$@" || return; }\n'
# note that $zero can be empty, but must be set.
if [ $# -lt 3 ] || [ -z "$1" ] || [ -z "$2" ] || [ "${3+x}" != x ]; then
printf "$usage" argc >&2
return 2
fi
local cond="$1"; shift
local want="$1"; shift
local zero="$1"; shift
local many='' plural=''
[ "$want" = 1 ] || plural='s'
case "$cond" in
'-eq') many='exactly';;
# '-lt') many='fewer than';;
# '-gt') many='more than';;
'-le') many='at most';;
'-ge') many='at least';;
*)
printf "$usage" argc >&2
return 2;;
esac
case "$want" in
[0-9]) :;; # no error, continue.
*)
printf "$usage" argc >&2
return 2;;
esac
if [ ! $# "$cond" "$want" ]; then
local err="expected $many $want argument$plural, got"
printf '%s: %s %s\n' "$zero" "$err" "$#" >&2
return 1
fi
return 0
}
[ -n "${preload+-}" ] || argc "$@"