如何在bash中使用regexp验证版本号是否有效?

如何在bash中使用regexp验证版本号是否有效?,regex,bash,Regex,Bash,我试图验证版本号是否与版本模式匹配,但由于某种奇怪的原因,检查似乎失败了 #!/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 #/bi

我试图验证版本号是否与版本模式匹配,但由于某种奇怪的原因,检查似乎失败了

#!/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
#/bin/bash
VERSION=“1.2.3”
如果[[$VERSION=~^(\d+\)?(\d+\)?(\*\124;\ d+$]);然后
echo“信息:版本$Version”
其他的
echo“错误:无法验证包版本:“$version”
出口1
fi

您应该在Bash中使用
[0-9]
[:digit:]]
而不是
\d
(因为Bash不支持这个速记字符类),我建议在a的帮助下缩短模式,并将模式放入变量中:

#!/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
#/bin/bash
VERSION=“1.2.3”
rx=“^([0-9]+\){0,2}(\*|[0-9]+)$”
如果[[$VERSION=~$rx]];然后
echo“信息:版本$Version”
其他的
echo“错误:无法验证包版本:“$version”
出口1
fi


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

只需将
\d
替换为
[0-9]
。是否确实要允许匹配
*
字符串?您还可以使用
^([0-9]+\){0,2}(\*\[0-9]+)$
,这是shorter@WiktorStribi你为什么这么说<代码>\d和
[0-9]
完全相同@Shafizadeh我不确定bash是否支持
\d
@Thomas Oh。。这就是重点。。好的,tnxbash使用posix字符类:如果您还想匹配后缀,比如
1.2.3-dev
(semver“允许”这些后缀)
rx='^([0-9]+\){2,2}(\*.[0-9]+)(\-.{0,1}$'
@MichaelLihs,或者是相同模式的一个更干净的版本,
rx='^([0-9]+\.+-.[-.-.-.-.-.-.-.-.[0-1249]+++-.-.-.-.-.-.[[0]+]