Newer
Older
tpromptuser / tpromptuser.sh
@tundra tundra on 7 Oct 2010 2 KB Initial Version
#!/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"