脚本百例—3: 获取用户输入,并根据输入内容判断后续执行
标签搜索

脚本百例—3: 获取用户输入,并根据输入内容判断后续执行

mrui
2024-09-19 / 0 评论 / 63 阅读 / 正在检测是否收录...

编写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
    
0

评论

博主关闭了当前页面的评论