<!--
@page { margin: 0.79in }
P { margin-bottom: 0.08in }
-->
问题:
你需要从用户那里得到简单的yes或no的输入,并且你期望做到用户界面的友好,做到能够区分大小写,并且提供用户点击Enter的默认选项。
解决方案
如果是简单的行为,可以使用下面这个函数。
#
cookbook filename: func_choose
#
Let the user make a choice about something and execute code based on
#
the answer
#
Called like: choose <default (y or n)> <prompt> <yes
action> <no action>
#
e.g. choose "y" /
#
"Do you want to play a game?" /
#
/usr/games/GlobalThermonucularWar /
#
'printf "%b" "See you later Professor Falkin."'
>&2
#
Returns: nothing
function
choose {
local
default="$1"
local
prompt="$2"
local
choice_yes="$3"
local
choice_no="$4"
local
answer
read
-p "$prompt" answer
[
-z "$answer" ] && answer="$default"
case
"$answer" in
[yY1]
) exec "$choice_yes"
#
error check
;;
[nN0]
) exec "$choice_no"
#
error check
;;
*
) printf "%b" "Unexpected answer '$answer'!"
>&2 ;;
esac
}
# end of function choose
如果是复杂的操作,可以使用下面的函数
#
cookbook filename: func_choice.1
#
Let the user make a choice about something and return a standardized
#
answer. How the default is handled and what happens next is up to
#
the if/then after the choice in main
#
Called like: choice <promtp>
#
e.g. choice "Do you want to play a game?"
$
Returns: global variable CHOICE
function
choice {
CHOICE=''
local
prompt="$*"
local
answer
read
-p "$prompt" answer
case
"$answer" in
[yY1]
) CHOICE='y';;
[nN0]
) CHOICE='n';;
*
) CHOICE="$answer";;
esac
}
# end of function choice
下面这段代码调用choice函数,提示用户确认时间。假设$THISPACKAGE已经设定,将显示时间并要求用户确认,如果用户选择y,Y,或者Enter,那么这个时间就被接受,如果用户输入一个新的时间,函数将循环并且要求用户确认。
#
cookbook filename: func_choice.2
until
[ "$CHOICE" = "y" ]; do
printf
"%b" "This package's date is $THISPACKAGE/n" >&2
choice
"Is that correct? [Y/,<New date>]: "
if
[ -z "$CHOICE" ]; then
CHOICE='y'
elif
[ "$CHOICE" != "y" ]; then
printf
"%b" "Overriding $THISPACKAGEwith ${CHOICE}/n"
THISPACKAGE=$CHOICE
fi
done
#
Build the package here
接下来,使用其他方法来解决这个问题。用户通过认真阅读提示和查看默认行为,可以简单的点击Enter,脚本将执行默认操作。
#
If the user types anything except a case insensitive 'n', they will
#
see the error log
choice
"Do you want to look at the error log file? [Y/n]: "
if
[ "$choice" != "n" ]; then
less
error.log
fi
#
If the user types anything except a case insensitive 'y', they will
#
not see the message log
choice
"Do you want to look at the message log file? [y/N]: "
if
[ "$choice" = "y" ]; then
less
message.log
fi
最后,如果用户没有输入,可以使用下面的方法解决
#
cookbook filename: func_choice.3
choice
"Enter your favorite color, if you have one: "
if
[ -n "$CHOICE" ]; then
printf
"%b" "You chose: $CHOICE"
else
printf
"%b" "You do not have a favorite color."
fi