diff --git a/sh/permit b/sh/permit index 8a5a17a..1358e92 100755 --- a/sh/permit +++ b/sh/permit @@ -25,7 +25,7 @@ permit() { ### @- conditionally set executable permissions on each of its argume ### already executable by the current user are skipped. arguments that do ### not appear to refer to an existing file are passed through to chmod. ### directories are never recursed. - unset __permit_4 __permit_a __permit_f __permit_h __permit_m __permit_n __permit_x || return + unset __permit_4 __permit_a __permit_f __permit_h __permit_m __permit_x || return __permit_h="[-a | -A] [-e | -f | -d] [--] {files...}" if [ $# = 0 ]; then @@ -33,43 +33,34 @@ permit() { ### @- conditionally set executable permissions on each of its argume return 64; fi - __permit_m=e # everything + __permit_m=e # mode __permit_a=0 # automatic - __permit_n=$# - while [ $((__permit_n-=1)) -ge 0 ]; do - __permit_f="$1" - case "$__permit_f" in - + unset __permit_stop || return + for __permit_f; do + shift + case "${__permit_stop+:}$__permit_f" in (/\?|-h|-help|--help) printf 'usage: permit %s\n' "$__permit_h" return 0;; - (--) - shift - while [ $((__permit_n-=1)) -ge 0 ]; do - set -- "$@" "$1" - shift - done - break;; - + __permit_stop=1;; (-?*) - shift while __permit_f="${__permit_f#?}"; [ -n "$__permit_f" ]; do case "${__permit_f}" in + (a*) __permit_a=1;; # automatic (on) (A*) __permit_a=0;; # automatic (off) (e*) __permit_m=e;; # everything (f*) __permit_m=f;; # files only (d*) __permit_m=d;; # directories only + (*) printf >&2 'permit: unknown flag: -%.1s\n' "$__permit_f" return 64;; esac done;; - (*) - shift set -- "$@" "$__permit_f";; esac done