【问题标题】:BASH - Prompting for AnswersBASH - 提示答案
【发布时间】:2018-02-04 11:51:27
【问题描述】:

我使用以下内容作为向我的用户询问一些输入的基础。

while true; do
    echo "Proceed (y/n)"
    read yn
    case $yn in
        [Nn]*) break;;
        [Yy]*)
            while true; do
                echo "name"
                read name

                echo "id"
                read id

                echo "email"
                read email

                echo "location"
                read -i "south" location

                while true; do
                    echo -e "\nIs the above correct ? (y/n)"
                    read res
                    case $res in
                        [Nn]* ) break 1;;
                        [Yy]* )
                            echo -e "\nHere we go."

                            break 3;;
                    esac
                done
            done;;
        *) echo "Please answer yes or no.";;
    esac
done

如果他们对“以上是否正确”的回答是否定的,他们将被带回到问题的开头。这很好,但我如何用他们之前的答案预先填写答案?

目前,当他们返回开始时,结果默认返回原始条目,或者空白或默认选项。

谢谢

【问题讨论】:

    标签: bash prompt


    【解决方案1】:

    我会更多地使用-i 选项来使用先前读取的值预填充read 命令的输入。用户可以根据需要编辑该值。您也可以使用-p 选项将提示直接添加到read 命令中。

    location=south
    while true; do
        read -p "Proceed (y/n)" yn
        case $yn in
            [Nn]*) break;;
            [Yy]*)
                while true; do
                    read -p "Name: " -i "$name" name
                    read -p "ID: " -i "$id" id
                    read -p "Email: " -i "$email" email
                    read -p "Location: " -i "$location" location
    
                    while true; do
                        read -p "Is the above correct ? (y/n)"res
                        case $res in
                            [Nn]* ) break 1;;
                            [Yy]* )
                                echo -e "\nHere we go."
    
                                break 3;;
                        esac
                    done
                done;;
            *) echo "Please answer yes or no.";;
        esac
    done
    

    【讨论】:

    • 感谢您的回复。我一直在使用echo,因为它可以让我更改提示的颜色。可以用read -p完成吗
    • 这对我不起作用。当我说不时,没有预先填写任何值。
    • 哪个“不”?您必须对Proceed 至少回答一次。
    • 输入我的详细信息后,我会看到“以上是否正确”如果我回答“否”,那么问题会重复,但不会显示我之前的答案。
    【解决方案2】:

    如果我了解您想要做什么,您想保留并显示用户在选择“否”到“以上是否正确?”之前输入的最后一个值,那么您需要做的只是测试变量是否已经设置,如果是,则显示原始值的提示,如果没有,则直接显示提示。

    这仅适用于第一个用户,但从那时起,您负责根据需要使用变量值,然后在开始提示下一个人之前取消设置值。您正在使用变量是否为空来确定是否显示“仅提示”并且变量已填充,则显示“带有先前答案的提示”。

    有很多方法可以做到这一点。最简单的基于您现有的脚本是这样的:

    name=
    id=
    email=
    south=
    location=
    while true; do
        echo "Proceed (y/n)"
        read yn
        case $yn in
            [Nn]*) break;;
            [Yy]*)
                while true; do
                    [ -n "$name" ] && echo "name: $name" || echo "name: "
                    read name
    
                    [ -n "$id"] && echo "id: $id" || echo "id: "
                    read id
    
                    [ -n "$email" ] && echo "email: $email" || echo "email: "
                    read email
    
                    [ -n "$location" ] && echo "location: $location" || echo "location: "
                    read -i "south" location
    
                    while true; do
                        echo -e "\nIs the above correct ? (y/n)"
                        read res
                        case $res in
                            [Nn]* ) break 1;;
                            [Yy]* )
                                echo -e "\nHere we go."
                                ## use vars and then unset for next person
                                break 3;;
                        esac
                    done
                done;;
            *) echo "Please answer yes or no.";;
        esac
    done
    

    检查一下,让我知道我是否正确理解了您,以及您是否有任何变化。我很乐意提供进一步的帮助。

    【讨论】:

    • 运行时出现错误。syntax error near unexpected token (' ` echo -e "\n上述是否正确?(y/n)"'`
    • 在 ` [ -n "$id]` 中似乎缺少 "
    • 哦.... duh..... 谢谢修复。 (每次都会这样做...)另请注意,这是一个如何输出旧值的示例,实际上它们应该与read'-i' 选项一起呈现。
    【解决方案3】:

    (题外话:我会尽量避免break 3。)
    您可以编写一个函数readDefault,使用$1 变量来显示/读取默认值和其他参数作为可选提示。

    readDefault() {
       varname=$1
       shift
       if [ $# -eq 0 ]; then
          read -p "${varname} [${!varname}]: " userinput
       else
          read -p "$* [${!varname}]: " userinput
       fi
       printf -v ${varname} "%s" "${userinput:-${!varname}}"
    }
    
    # First time defaults outside loop
    location="south"
    while true; do
        echo "Proceed (y/n)"
        read yn
        case $yn in
            [Nn]*) break;;
            [Yy]*)
                while true; do
                    readDefault name "What is your name"
                    readDefault id
                    readDefault email "Used for sending monthly reports"
                    readDefault location
    
                    while true; do
                        echo "Current values: ${name}, ${id}, ${email}, ${location}"
                        echo -e "\nIs the above correct ? (y/n)"
                        read res
                        case $res in
                            [Nn]* ) break 1;;
                            [Yy]* )
                                echo -e "\nHere we go."
    
                                break 3;;
                        esac
                    done
                done;;
            *) echo "Please answer yes or no.";;
        esac
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多