我试图创建一个脚本,只是为了创造新用户并为他生成密码的乐趣。
现在我必须检查用户是否输入了一些愚蠢的东西而不是数字。
function checkifcorrectnum() {
#Check if the User did something else than enter a number
#And check if the Number is absurdly big
case "$1" in
[[:digit:]] ) if [ "$1" -gt "255" ]; then echo "Too big!" ; else : ; fi ;;
*) echo "Please enter a number!"; exit ;;
esac
}
但是当我运行脚本并输入1-9时它可以正常工作,但是更高的东西不会
答案 0 :(得分:1)
您只需按[[:digit:]]
匹配单个数字。 bash
globbing不能像Regex一样使用,并且*
或+
等运营商可以多次匹配任何令牌。如果您想坚持使用您的方法,并且您确切知道要允许多少位数,那么请使用例如2位数:
case "$1" in
[[:digit:]][[:digit:]])
如果您不确定:
case "$1" in
[[:digit:]]*)
*
扩展为任意数量的角色。
但我认为您应该查看bash
=~
运算符[[
提供的正则表达式匹配,因此您的整个函数可以重写为:
if [[ $1 =~ ^[[:digit:]]+$ ]]; then
[[ $1 -gt 255 ]] && echo "Too big!"
else
echo 'Please enter a number!' && exit
fi
如果数字为<=255
,那么您没有做任何事情,因此[[ $1 -gt 255 ]] && echo "Too big!"
就足够了。
答案 1 :(得分:0)
由于测试一个字符串是否不是一个数字比测试它是否更容易,我建议反转测试的顺序:
function checkifcorrectnum() {
case "$1" in
*[^[:digit:]]*) echo "Please enter a number";;
*) [ "$1" -gt "255" ] && echo "Too big!" ;;
esac;
}
如果*[^[:digit:]]*
中的任何字符不是数字,则<{1}}匹配。
示例:
$1
另外,关键字$ checkifcorrectnum 255
$ checkifcorrectnum 256
Too big!
$ checkifcorrectnum 25z
Please enter a number
仅限bash,通常不需要。删除关键字后,代码不仅可以在bash中运行,也可以在任何POSIX兼容的shell中运行。