首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >0-9和[[:位数:]]将匹配1-10,但不会更多。

0-9和[[:位数:]]将匹配1-10,但不会更多。
EN

Stack Overflow用户
提问于 2016-08-17 22:46:30
回答 2查看 749关注 0票数 0

我正试图制作一个脚本,只是为了好玩,它创建了一个新用户,并为他生成了一个密码。

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

代码语言:javascript
复制
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时,它可以工作,但是任何更高的操作都不会。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-17 22:58:19

您只需要通过[[:digit:]]来匹配一位数字。bash全局不能像Regex一样使用,也不能被*+之类的操作符多次匹配。如果您想坚持使用您的方法,并且确切地知道要允许多少位数字,那么可以使用例如2位数字:

代码语言:javascript
复制
case "$1" in
  [[:digit:]][[:digit:]])

如果你不确定,那么:

代码语言:javascript
复制
case "$1" in
  [[:digit:]]*)

*扩展到任意数量的字符。

但是,我认为您应该看看bash提供的Regex匹配,由[[=~运算符提供,这样您的整个函数可以重写为:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-08-17 23:44:47

由于测试字符串是否不是数字比测试是否为数字更容易,因此我建议倒转测试的顺序:

代码语言:javascript
复制
function checkifcorrectnum() {
  case "$1" in
    *[^[:digit:]]*) echo "Please enter a number";;
    *) [ "$1" -gt "255" ] && echo "Too big!" ;;
  esac;
}

如果*[^[:digit:]]*中的任何字符不是数字,则glob $1匹配。

示例:

代码语言:javascript
复制
$ checkifcorrectnum 255
$ checkifcorrectnum 256
Too big!
$ checkifcorrectnum 25z
Please enter a number

顺便说一句,关键字function是bash专用的,一般不需要.删除关键字后,代码不仅在bash中工作,而且在任何与POSIX兼容的shell中都能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39007384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档