其他答案有很多缺陷,因为他们检查用户没有输入超出他们想要的范围的数字。但是如果用户输入的不是数字怎么办?他们的策略从一开始就被打破了。
相反,最好只有在我们确定用户输入的数字在所需范围内时才放手。
while :; do
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] || continue
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || continue
# Here I'm sure that number is a valid number in the range 0..9999
# So let's break the infinite loop!
break
done
正则表达式[[ $number =~ ^[[:digit:]]+$ ]]
确保用户只输入数字。
笨拙的(number=(10#$number))
部分在这里,如果用户输入一个以 a 开头的数字0
,bash 会尝试以基数解释它,8
我们会得到错误的结果(例如,如果用户输入010
),甚至在以下情况下会出错用户输入,例如09
(尝试不使用此防护)。
如果您只想在用户输入无效术语时提示一次并退出,您的逻辑是:
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] || exit 1
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || exit 1
# Here I'm sure that number is a valid number in the range 0..9999
如果您想向用户解释脚本退出的原因,您可以使用 die 函数:
die() {
(($#)) && printf >&2 '%s\n' "$@"
exit 1
}
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] ||
die '*** Error: you should have entered a number'
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) ||
die '*** Error, number not in range 0..9999'
# Here I'm sure that number is a valid number in the range 0..9999