0-9和[[:digit:]]将匹配1-10,但不会更多

时间:2016-08-17 22:46:30

标签: bash

我试图创建一个脚本,只是为了创造新用户并为他生成密码的乐趣。

现在我必须检查用户是否输入了一些愚蠢的东西而不是数字。

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时它可以正常工作,但是更高的东西不会

2 个答案:

答案 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中运行。