编写choice函数,用以获取用户输入内容,本例中为获取yYnN,
后面是三则函数调用案例,用以演示根据用户输入的内容,执行不同的操作。
特别说明:关于read命令
用read命令来读取用户输入,加上一个特殊选项可以关闭回显,这在提示用户输入密码等敏感信息时较为有用。read -s -p "Please enter your password: " PASSWD printf "%b" "\n"
-s选项告诉read命令不要回显输入的字符(s代表silent),-p选项指明下一个参数是提示信息,会在读取用户输入之前显示
因为read -s选项会关闭字符回显,而当禁止了回显功能,用户按下回车键时,就不会显示换行符,这就导致后续的输出就会和提示信息出现在同一行,这会造成版面上的混乱。用printf命令输出换行符,会将光标带到下一行。
关于关闭回显,stty -echo也可以用来禁止输入密码时的屏幕回显。但使用该命令的一个问题是回显始终处于关闭状态,需要手动输入stty sane 来将其恢复#!/bin/bash #由用户选择并返回标准答案。 #默认值的处理方式及接下来怎么做,取决于主代码中choice函数之后的if/then分支 #调用方式: choice <prompt> #例如: choice "do you want to play a game?" #返回值:全局变量CHOICE function choice { CHOICE='' local prompt="$*" local answer read -p "$prompt" answer case $answer in [yY1]) CHOICE='y';; [nN0]) CHOICE='n';; *) CHOICE="$answer";; esac } #调用choice函数,提示并核实软件包的日期。如果已经设置$THISPACKAGE,则代码显示该日期,并要求用户核实。 #如果用户输入yY,或者直接按下回车键,就接受所显示的日期。 #如果用户输入新的日期,代码则再次循环,继续核实日期。 CHOICE='' 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 $THISPACKAGE with $CHOICE\n" THISPACKAGE=$CHOICE fi done #调用choice函数,如果用户输入“n”(不区分大小写)之外的任何内容,则会看到错误日志 #如果用户输入“y”(不区分大小写)之外的任何内容,则看不到消息日志。 choice "Do you want to look at the error logfile? [Y/n]:" if [ $CHOICE != "n" ];then less error.log 2>/dev/null fi choice "Do you want to look at the message logfile?[y/N]:" if [ $CHOICE == "y" ];then less message.log 2>/dev/null fi #要求用户输入信息(有可能不存在任何输入) choice "Please enter your favorite ccolor,if you have one:" if [ -n "$CHOICE" ];then printf "%b" "you choice: $CHOICE\n" else printf "%b" "You do not have a favorite color.\n" fi
评论