【问题标题】:Only allow numbers from standard input (read command)只允许来自标准输入的数字(读取命令)
【发布时间】:2014-11-17 09:40:23
【问题描述】:

我有一个文件,其中包含 .sh 文件的路由列表,但要执行脚本需要一个日期,该文件的日期是 YYYYMMD。当我运行执行脚本列表的脚本时,我使用readcommand 提示用户输入日期。

我的问题是我需要 100% 确定用户输入的日期至少是所有数字,我该怎么做?我已经确保输入的最大字符数为 8,所以我只需要允许用户输入数字。这就是我目前所拥有的。

echo 'Input date (YYYYMMDD)'
read -n 8 date

有什么想法吗?

谢谢。

【问题讨论】:

    标签: linux ksh


    【解决方案1】:

    你应该使用while循环:

    number=""
    while [[ ! $number =~ ^[0-9]{8} ]]; do
        echo Please enter your age
        read number
    done
    

    ^[0-9]{8} 表示“从 0 到 9 的 8 个数字”

    【讨论】:

    • 嗯,它不起作用,给我一个语法错误,我已经在尝试这个,我已经尝试过while [[ $number != [0-9]{8} ]]
    • line 50: syntax error at line 52: ~(E)^[0-9]{8} ]]
    • @GaryPerry 我现在无法测试,你应该看看here
    【解决方案2】:

    在得到@Thomas 的帮助后,我解决了我的问题。解决方案是将输入变量与正则表达式进行比较。但由于某种原因,直接这样做是行不通的,所以我将正则表达式保存在一个变量中,然后比较变量。

    reg='^[0-9]{8}$'
    while [[ ! $number =~ $reg ]]
    do
     echo 'The format is wrong'
    done
    

    ^

    [0-9]{8}

    $

    =~

    希望这个答案有所帮助!

    谢谢

    PS:如果有人知道为什么直接进行比较时无法进行比较,请告诉我。

    【讨论】:

      【解决方案3】:

      我发现 until 循环在许多情况下都可以很好地完成这项工作。

      我在另一个论坛上找到了比较的语法并且它有效,而这里提到的一些语法向我抛出了错误。请注意“..+$”结尾和包含 [+-]?.. 或 [+].. 仅在正数的情况下。

      说实话,我还在学习,我不知道为什么这个语法对我有用,而不是其他人在这里发布的。

      注意:如果没有 -p 标志,这将不起作用,而使用 -n 解释器会不高兴。

      #!/bin/bash
      read -p 'Input date (YYYYMMDD): ' date
      until [[ $date =~ ^[+]?[0-9]{8}+$ ]]
      do
          echo "Oops! User input was not 8 characters and/or not a positive integer!"
          echo
          read -p 'Input date (YYYYMMDD): ' date
      done
      
      echo "User gave a valid input: $date"
      

      控制台输出:

      Input date (YYYYMMDD): very age
      Oops! User input was not 8 characters and/or not a positive integer!
      
      Input date (YYYYMMDD): -19670218
      Oops! User input was not 8 characters and/or not a positive integer!
      
      Input date (YYYYMMDD): 670218
      Oops! User input was not 8 characters and/or not a positive integer!
      
      Input date (YYYYMMDD): 19670218
      User gave a valid input: 19670218
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        相关资源
        最近更新 更多