die() { if [ "$*" ]; then printf 'Error: %s\n' "$*" >&2 else echo 'Error: fatal error' >&2 fi exit 1 } nosex() { case $- in *x*) set +x; "$@"; set -x;; *) "$@";; esac } _nonempty() { printf '[ "${%s}" ] || die \"mandatory parameter is empty: %s\";\n' "$1" "$1" } _mandatory() { printf '[ $# -ge %d ] || die \"mandatory parameter is missing: %s\";\n' "$2" "$1" } _assign() { printf 'local %s="${%d}";\n' "$1" "$2" } _args() { local v i=1 check="$1" assign="$2" shift shift for v; do $assign "$v" "$i" $check "$v" "$i" i=$((i+1)) done } _ARGS() { echo eval "$(_args _mandatory _assign "$@")" } _ARGS_NONEMPTY() { echo eval "$(_args _nonempty _assign "$@")" } _ARGS_OPTIONAL() { echo eval "$(_args : _assign "$@")" } _NONEMPTY() { echo eval "$(_args _nonempty : "$@")" } ARGS() { nosex _ARGS "$@"; } ARGS_NONEMPTY() { nosex _ARGS_NONEMPTY "$@"; } ARGS_OPTIONAL() { nosex _ARGS_OPTIONAL "$@"; } NONEMPTY() { nosex _NONEMPTY "$@"; } ARGS_NE() { ARGS_NONEMPTY "$@"; } if [ "${0#-}" = bash ]; then export -f die _nonempty _mandatory _args ARGS ARGS_NONEMPTY ARGS_OPTIONAL fi