我写了一个bash脚本,通过用户输入获取数字进行计算。我遇到的问题是,如果用户错误地输入字母或空格,整个脚本就会失败,用户必须重新开始。
有一种简单的方法可以检查输入是否仅为数字,如果意外输入其他内容,则会再次要求输入?
有一种简单的方法可以检查输入是否仅为数字,如果意外输入其他内容,则会再次要求输入?
使用while循环
number=""
while [[ ! $number =~ ^[0-9]+$ ]]; do
echo Please enter your age
read number
done
echo You are $number years old
为避免使用繁重的正则表达式引擎,使用简单的glob:
if [[ ! $input || $input = *[^0-9]* ]]; then
echo "Error: '$input' is not a number." >&2
fi
允许数字前后有空格,例如 _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}
# -- 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