【问题标题】:Check user input is correct [duplicate]检查用户输入是否正确[重复]
【发布时间】:2019-09-01 02:55:19
【问题描述】:

我编写了一个 bash 脚本,它通过用户输入来计算数字。我遇到的问题是,如果用户错误地输入了字母或空格,整个脚本就会失败,用户必须重新开始。

必须有一种简单的方法来检查输入是否仅为数字,如果意外输入了其他任何内容,它将再次要求输入?

【问题讨论】:

    标签: bash


    【解决方案1】:

    使用while循环

    number=""
    while [[ ! $number =~ ^[0-9]+$ ]]; do
        echo Please enter your age
        read number
    done
    echo You are $number years old
    

    【讨论】:

    • 是的,这行得通,谢谢,但我重复使用相同的变量,所以下次它出现时,它有一个来自最后一个条目的值。有什么想法吗?
    • 我不太明白你的意思。这就是为什么我们在进入循环之前将其设置为空字符串:)
    • 上面的解决方案仍然接受像“22aa”、“aa 22”或“a23bb”这样的输入。正则表达式应包括字符串的开头和结尾: while [[ ! ($number =~ ^[0-9]+$) ]];做
    • 感谢 litb 而 [[ ! ($number =~ ^[0-9]+$) ]];这就是我在非常感谢 danke 之后所做的事情
    【解决方案2】:

    为了避免使用繁重的正则表达式引擎,请使用简单的 glob:

    if [[ ! $input || $input = *[^0-9]* ]]; then
        echo "Error: '$input' is not a number." >&2
    fi
    

    【讨论】:

    • 哦,好主意。我一直忘记[[的通配符设施。我发现它虽然接受“”。 "$input = "" || $input = [^0-9]" 应该修复它。
    • 失败,因为它接受空输入。
    【解决方案3】:

    在数字 _33 或 33___ 之前和之后允许空格,但不能在 3__3 之前和之后。并且没有字母。 0 或

    -- 从用户那里获取输入直到正确

        # -- get input until Correct
        unset get_num
        while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do
            echo "Please enter in a number:"
            read get_num
        done
        echo This is a number :  ${get_num}
    

    -- 获取输入直到正确(范围内)

        # -- get input until Correct (within range)
        unset get_num
        while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do
            echo "Please enter in a number within range of (1-30):"
            read get_num
            ! [[ ${get_num} -ge 1 && ${get_num} -le 30  ]] && unset get_num
        done
        echo This is a number withn a range :  ${get_num}
    

    -- 获取输入直到正确(在范围内)(完整的正则表达式方式)

    “由于正则表达式处理的是文本而不是数字,因此匹配给定范围内的数字需要格外小心。你不能只写 [0-255] 来匹配 0 到 255 之间的数字。虽然有效的正则表达式,它匹配完全不同的东西。[0-255] 是一个包含三个元素的字符类:字符范围 0-2、字符 5 和字符 5(再次)。这个字符类匹配单个数字 0、1 , 2 或 5, 就像 [0125]。” ~http://www.regular-expressions.info/numericranges.html

        # -- get input until Correct (within range) (another way)
        unset get_num
        while [[ ! ${get_num} =~ ^([1-9]|1[0-9]|2[0-9]|30)$ ]]; do
            echo "Please enter in a number within range of (1-30):"
            read get_num
        done
        echo This is a number withn a range :  ${get_num}
    

    -- 获取输入,仅检查(无 while 循环)

        # -- get input, and check it only (no while loop)
        unset get_num
        echo "Please enter in a number:"
        read get_num
        if [[ ! ${get_num} =~ ^[0-9]+$ ]] ;then 
            echo "${get_num} isn't a number" 
        else
            echo "${get_num} is a number"
        fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2020-04-30
      • 1970-01-01
      相关资源
      最近更新 更多