応答要求のスタイルを定型化した関数

関数名: Question
書式: Question 質問文 デフォルト値 ヘルプメッセージ
目的: 指定したメッセージを標準出力に書き出し、ユーザに応答を要求する

Question() {
    if [ $# -lt 3 ]; then
        echo "Usage: Question question default helpmessage" 1>&2
        exit 1
    fi
    ANSWER=
    _DEFAULT=$2
    _QUESTION=
    _HELPMSG=$3

    if [ "$_DEFAULT" = "" ]; then
        _QUESTION="$1? "
    else
        _QUESTION="$1 [$_DEFAULT]? "
    fi

    while :; do
        if [ "`echo -n`" = "-n" ]; then
#            echo -n "$_QUESTION\c"
        else
            echo -n "$_QUESTION"
        fi
        read ANSWER
        case `echo "$ANSWER" | tr [A-Z] [a-z]` in

            #応答がなかった場合はデフォルト値を設定する
            ""       )  if [ "$_DEFAULT" != "" ]; then
                            ANSWER=$_DEFAULT
                            break
                        fi ;;
            yes | y  )  ANSWER=yes
                        break ;;
            no  | n  )  ANSWER=no
                        break ;;
            quit | q )  exit 1
                        ;;

            #シェルのデバッグオプションを使用
            +x | -x  )  set $ANSWER
                        ;;

            #コマンドの実行
            !*       )  eval `expr "$ANSWER" : "!\(.*\)"`
                        ;;
            "?"      )  echo ""
                        if [ "$_HELPMSG" = "" ]; then
                            echo "No help available."
                        else
                            echo "$_HELPMSG"
                        fi
                        echo ""
                        ;;
            *        )  break
                        ;;
        esac
    done
}