| # |
| # 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 |
| # |
| # Copyright 2002 Chester Ramey |
| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 2, or (at your option) |
| # any later version. |
| # |
| # TThis program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, write to the Free Software Foundation, |
| # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| |
| 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 |