如何使用Bash中的正则表达式验证版本号是否有效?

5

我正在尝试验证版本号是否符合版本模式,但似乎检查失败了,原因很奇怪。

#!/bin/bash
VERSION="1.2.3"
if [[ $VERSION =~ ^(\d+\.)?(\d+\.)?(\*|\d+)$ ]]; then
 echo "INFO:<-->Version $VERSION"
else
 echo "ERROR:<->Unable to validate package version: '$VERSION'"
 exit 1
fi

2
只需将\d替换为[0-9]。你真的想允许匹配*字符串吗?你也可以使用^([0-9]+\.){0,2}(\*|[0-9]+)$,它更短。 - Wiktor Stribiżew
@WiktorStribiżew 你为什么这么说?\d[0-9]是完全相同的... http://uploads.im/9Bc8Y.png - Shafizadeh
@Shafizadeh 我不确定bash是否支持\d - Thomas Ayoub
@Thomas 哦..原来如此..好的,谢谢。 - Shafizadeh
Bash使用POSIX字符类:http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_03.html#sect_04_03_02 - Marc B
1个回答

20

在Bash中,你应该使用[0-9][[:digit:]]代替\d(因为Bash不支持这个速记字符类),我建议使用限定量词缩短模式,并将模式放入变量中:

#!/bin/bash
VERSION="1.2.3"
rx='^([0-9]+\.){0,2}(\*|[0-9]+)$'
if [[ $VERSION =~ $rx ]]; then
 echo "INFO:<-->Version $VERSION"
else
 echo "ERROR:<->Unable to validate package version: '$VERSION'"
 exit 1
fi

请查看IDEONE演示

([0-9]+\.){0,2}的部分匹配1个或多个数字,后跟文字“.” 0、1或2次。


这里对正则表达式进行了一点修改,如果您还想匹配后缀,比如 1.2.3-dev(这是 semver 允许的),则可以使用以下正则表达式:rx='^([0-9]+\.){2,2}(\*|[0-9]+)(\-.*){0,1}$' - Michael Lihs
2
@MichaelLihs 或者,同样模式的一个更干净的版本是 rx='^([0-9]+\.){2}(\*|[0-9]+)(-.*)?$' - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接