1# 2# shprompt -- give a prompt and get an answer satisfying certain criteria 3# 4# shprompt [-dDfFsy] prompt 5# s = prompt for string 6# f = prompt for filename 7# F = prompt for full pathname to a file or directory 8# d = prompt for a directory name 9# D = prompt for a full pathname to a directory 10# y = prompt for y or n answer 11# 12# Chet Ramey 13# chet@ins.CWRU.Edu 14 15type=file 16 17OPTS=dDfFsy 18 19succeed() 20{ 21 echo "$1" 22 exit 0 23} 24 25while getopts "$OPTS" c 26do 27 case "$c" in 28 s) type=string 29 ;; 30 f) type=file 31 ;; 32 F) type=path 33 ;; 34 d) type=dir 35 ;; 36 D) type=dirpath 37 ;; 38 y) type=yesno 39 ;; 40 ?) echo "usage: $0 [-$OPTS] prompt" 1>&2 41 exit 2 42 ;; 43 esac 44done 45 46if [ "$OPTIND" -gt 1 ] ; then 47 shift $[$OPTIND - 1] 48fi 49 50while : 51do 52 case "$type" in 53 string) 54 echo -n "$1" 1>&2 55 read ans || exit 1 56 if [ -n "$ans" ] ; then 57 succeed "$ans" 58 fi 59 ;; 60 file|path) 61 echo -n "$1" 1>&2 62 read ans || exit 1 63 # 64 # use `fn' and eval so that bash will do tilde expansion for 65 # me 66 # 67 eval fn="$ans" 68 case "$fn" in 69 /*) if test -e "$fn" ; then 70 succeed "$fn" 71 else 72 echo "$0: '$fn' does not exist" 1>&2 73 fi 74 ;; 75 *) if [ "$type" = "path" ] ; then 76 echo "$0: must give full pathname to file" 1>&2 77 else 78 if test -e "$fn" ; then 79 succeed "$fn" 80 else 81 echo "$0: '$fn' does not exist" 1>&2 82 fi 83 fi 84 ;; 85 esac 86 ;; 87 dir|dirpath) 88 echo -n "$1" 1>&2 89 read ans || exit 1 90 # 91 # use `fn' and eval so that bash will do tilde expansion for 92 # me 93 # 94 eval fn="$ans" 95 case "$fn" in 96 /*) if test -d "$fn" ; then 97 succeed "$fn" 98 elif test -e "$fn" ; then 99 echo "$0 '$fn' is not a directory" 1>&2 100 else 101 echo "$0: '$fn' does not exist" 1>&2 102 fi 103 ;; 104 *) if [ "$type" = "dirpath" ] ; then 105 echo "$0: must give full pathname to directory" 1>&2 106 else 107 if test -d "$fn" ; then 108 succeed "$fn" 109 elif test -e "$fn" ; then 110 echo "$0 '$fn' is not a directory" 1>&2 111 else 112 echo "$0: '$fn' does not exist" 1>&2 113 fi 114 fi 115 ;; 116 esac 117 ;; 118 yesno) 119 echo -n "$1" 1>&2 120 read ans || exit 1 121 case "$ans" in 122 y|Y|[yY][eE][sS]) 123 succeed "yes" 124 ;; 125 n|N|[nN][oO]) 126 succeed "no" 127 exit 0 128 ;; 129 *) 130 echo "$0: yes or no required" 1>&2 131 ;; 132 esac 133 ;; 134 esac 135done 136 137exit 1 138