diff --git a/tpromptuser.sh b/tpromptuser.sh new file mode 100755 index 0000000..0cefd89 --- /dev/null +++ b/tpromptuser.sh @@ -0,0 +1,115 @@ +#!/bin/sh + +# Loop through a set of questions for the luser to answer, storing +# their response back into the prompt variable itself. +# +# This is convenient way to build answers to a set of configuration +# questions at the beginning of a script. +# +# This is cleaner than having an explicit prompt stanza for each +# variable in the script that needs to be set. +# +# Note that this uses the "eval ...\$$" rather than the more modern +# ${!var} idiom for indirect variable references. This is for +# portability. The latter form is a bash-ism and is not supported in +# a traditional Bourne Shell. +# +# This version implements a prompt table scheme that allows the +# specification of a default response and a list of legitimate +# single character answers to the prompt. If this list is empty, +# then any response to the prompt is accepted. + +# $Id: tpromptuser.sh,v 1.101 2010/10/07 18:26:58 tundra Exp $ + +##### +# Constants +##### + +ORIGIFS=$IFS # Save current field separator +DL=':' # Prompt field delimeter + +##### +# Prompt Records +##### + +# Layout Of Fields In Prompt Record: +# +# Prompt<delim>Default Response (If user just hits Enter)<delim>Legal Answers + +foo="Would you like to foo?${DL}Y${DL}" # Empty last field means accept anything +bar="Would you like to bar?${DL}\!${DL}y Y n N" +baz="Would you like to baz?${DL}n${DL}yes Yes no No " +bat="Would you like to bat?${DL}""${DL}yes Yes no No " + + +# Display the records for purposes of this example only + +echo "Before: foo->$foo bar->$bar baz->$baz bat->$bat" + +##### +# Actual Prompting Logic +##### + + +for x in "foo" "bar" "baz" "bat" +do + eval record=\$$x # Get the prompt record + IFS=$DL # Get individual fields + read prompt default answers <<EOF +$record +EOF + + IFS=$ORIGIFS # And restore the original field separator + + # Now read input and check it against list of valid responses + + DONE=False + + while [ $DONE = False ] + do + + read -p "${prompt} (Default: ${default}) " ANS + + # We're done if the user took the default OR if the "Legal + # Answers" field is empty (which means we accept anything) + + if [ _$ANS = _ ] || [ _$answers = _ ] + then + DONE=True + + # Otherwise, make sure answer is legit + + else + for a in $answers # Check against each possible legal answer + do + if [ _$a = _$ANS ] + then + DONE=True + fi + done + + if [ _$DONE = _False ] + then + echo "Invalid Response! Must Be One Of $answers" + fi + fi + + done + + # Save the answer back into the original prompt variable, + # substituting the default value if the user entered nothing. + + ANS=${ANS:-$default} + + eval $x=\"$ANS\" +done + + +# End Of Prompting Logic + + + +# Dump results for sake of this example only + +echo "Before: foo->$foo bar->$bar baz->$baz bat->$bat" +