检查用户输入是否正确。

9
我写了一个bash脚本,通过用户输入获取数字进行计算。我遇到的问题是,如果用户错误地输入字母或空格,整个脚本就会失败,用户必须重新开始。
有一种简单的方法可以检查输入是否仅为数字,如果意外输入其他内容,则会再次要求输入?
3个回答

20

使用while循环

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

可以,谢谢。但是我正在重复使用同一个变量,所以下一次它会有上一个条目的值。你有什么想法吗? - Scott
1
我不太明白你的意思。这就是为什么在进入循环之前我们将其设置为空字符串的原因 :) - Johannes Schaub - litb
1
以上解决方案仍然接受像'22aa','aa 22'或'a23bb'这样的输入。正则表达式应包括字符串的开头和结尾:while [[ ! ($number =~ ^[0-9]+$) ]]; do - Fritz G. Mehner
感谢litb,当$number不是数字时,执行以下操作:这正是我想要的。非常感谢。 谢谢。 - Scott

8

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

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

哦,好主意。我经常忘记 [['s 能够进行 globbing。我发现它虽然接受了 "",但是 "$input = "" || $input = [^0-9]" 应该可以解决它。 - Johannes Schaub - litb
这个失败在于它接受空输入。 - user unknown

5

允许数字前后有空格,例如 _33 或 33___ ,但不允许出现 3__3 ,且不可包含字母。

当输入不正确时,持续获取用户输入。

-- 从用户获取输入直到正确为止

    # -- 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接