# # shprompt -- give a prompt and get an answer satisfying certain criteria # # shprompt [-dDfFsy] prompt # s = prompt for string # f = prompt for filename # F = prompt for full pathname to a file or directory # d = prompt for a directory name # D = prompt for a full pathname to a directory # y = prompt for y or n answer # # Chet Ramey # chet@ins.CWRU.Edu type=file OPTS=dDfFsy succeed() { echo "$1" exit 0 } while getopts "$OPTS" c do case "$c" in s) type=string ;; f) type=file ;; F) type=path ;; d) type=dir ;; D) type=dirpath ;; y) type=yesno ;; ?) echo "usage: $0 [-$OPTS] prompt" 1>&2 exit 2 ;; esac done if [ "$OPTIND" -gt 1 ] ; then shift $[$OPTIND - 1] fi while : do case "$type" in string) echo -n "$1" 1>&2 read ans || exit 1 if [ -n "$ans" ] ; then succeed "$ans" fi ;; file|path) echo -n "$1" 1>&2 read ans || exit 1 # # use `fn' and eval so that bash will do tilde expansion for # me # eval fn="$ans" case "$fn" in /*) if test -e "$fn" ; then succeed "$fn" else echo "$0: '$fn' does not exist" 1>&2 fi ;; *) if [ "$type" = "path" ] ; then echo "$0: must give full pathname to file" 1>&2 else if test -e "$fn" ; then succeed "$fn" else echo "$0: '$fn' does not exist" 1>&2 fi fi ;; esac ;; dir|dirpath) echo -n "$1" 1>&2 read ans || exit 1 # # use `fn' and eval so that bash will do tilde expansion for # me # eval fn="$ans" case "$fn" in /*) if test -d "$fn" ; then succeed "$fn" elif test -e "$fn" ; then echo "$0 '$fn' is not a directory" 1>&2 else echo "$0: '$fn' does not exist" 1>&2 fi ;; *) if [ "$type" = "dirpath" ] ; then echo "$0: must give full pathname to directory" 1>&2 else if test -d "$fn" ; then succeed "$fn" elif test -e "$fn" ; then echo "$0 '$fn' is not a directory" 1>&2 else echo "$0: '$fn' does not exist" 1>&2 fi fi ;; esac ;; yesno) echo -n "$1" 1>&2 read ans || exit 1 case "$ans" in y|Y|[yY][eE][sS]) succeed "yes" ;; n|N|[nN][oO]) succeed "no" exit 0 ;; *) echo "$0: yes or no required" 1>&2 ;; esac ;; esac done exit 1