【问题标题】:Bash confirm input or re enterbash 确认输入或重新输入
【发布时间】:2017-08-18 12:21:35
【问题描述】:

我有一个非常简单的 BASH 脚本,它询问用户是否想输入一些输入。回复是yn

如果他们输入n,则脚本退出。

如果他们输入y,那么他们会被问一些问题。最后我想请他们确认输入。

如果正确,我们会继续,如果不是,我想返回问题以重新输入信息。

到目前为止,我得到了:

while true; do
    echo -e "Enter details ? "
    read yn
    case $yn in
        [Nn]* ) exit;;
        [Yy]* ) 
            echo -e "description"
            read desc

            echo -e "Address"
            read address

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

这似乎工作正常,所以我尝试添加确认..但这不起作用。

while true; do
    echo -e "Enter details ? "
    read yn
    case $yn in
        [Nn]* ) exit;;
        [Yy]* ) 
            echo -e "description"
            read desc

            echo -e "Address"
            read address

            echo -e "$desc - $address"

            while true; do
                echo -e "\nAre these details correct ? "
                read conf
                case $conf in
                    [Nn]* ) // return to enter details //
                    [Yy]* ) // carry on with the details entered // break;;
                esac
            done


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

目标如下

用户选择y 并输入描述和地址。该页面向他们显示了他们输入的内容的摘要,并询问他们are these details correct ? 他们是否我们继续前进并且脚本继续进行。输入错误然后脚本返回它们以输入描述,然后输入地址。

有人可以建议如何做到这一点。 谢谢

【问题讨论】:

    标签: bash prompt


    【解决方案1】:

    您可以再添加一个循环级别并使用break [n] 的可选级别指示器:

    while true; do
        echo -e "Enter details ? "
        read yn
        case $yn in
            [Nn]*) exit;;
            [Yy]*)
                while true; do
                    echo -e "description"
                    read desc
    
                    echo -e "Address"
                    read address
    
                    echo -e "$desc - $address"
    
                    while true; do
                        echo -e "\nAre these details correct ? "
                        read conf
                        case $conf in
                            [Nn]* ) break 1;;
                            [Yy]* ) break 3;;
                        esac
                    done
                done;;
            *) echo "Please answer yes or no.";;
        esac
    done
    

    【讨论】:

    • 感谢我的理智,您能否确认 break1 和 break3 发生在哪里。
    • break 1break 相同:退出最内层循环。 break 3,在这种情况下退出最外层循环。
    • 快速跟进。如果他们回答“否”,说明细节不正确,我们将返回循环,但我们如何使用他们最后的答案自动填充问题?
    【解决方案2】:

    不要为此使用case。 例如为您编写的脚本:

    #!/bin/bash
    
    while true; do
        echo -e "Enter details ?(y/n)"
        read yn
        if [[ $yn == "y" ]];then
                echo -e "description"
                read desc
    
                echo -e "Address"
                read address
    
                echo -e "$desc - $address"
    
                while true; do
                    echo -e "\nAre these details correct ? (y/n)"
                    read conf
                    if [[ $conf == "y" ]];then
                        echo "All done"
                        break
                    elif [[ $conf == "n" ]];then
                        break
                    else
                        continue
                    fi
                done
        elif [[ $yn == "n" ]];then
            break
        else
            continue
        fi
    

    【讨论】:

      【解决方案3】:

      你去吧:

      DONE=""
      while [ "$DONE" != "true" ]; do
          echo -e "Enter details ? "
          read yn
          case $yn in
              [Nn]* ) exit;;
              [Yy]* )
                  echo -e "description"
                  read desc
      
                  echo -e "Address"
                  read address
      
                  echo -e "$desc - $address"
      
                  while true; do
                      echo -e "\nAre these details correct ? "
                      read conf
                      case $conf in
                          [Nn]* )
                              break;;
                          [Yy]* )
                              echo "doing something with your values"
                              DONE="true"
                              break;;
                      esac
                  done
              ;;
      
      
              * ) echo "Please answer yes or no.";;
          esac
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 2020-01-21
        相关资源
        最近更新 更多