我正在尝试验证版本号是否符合版本模式,但似乎检查失败了,原因很奇怪。
#!/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
在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 Lihsrx='^([0-9]+\.){2}(\*|[0-9]+)(-.*)?$'
。 - Wiktor Stribiżew
\d
替换为[0-9]
。你真的想允许匹配*
字符串吗?你也可以使用^([0-9]+\.){0,2}(\*|[0-9]+)$
,它更短。 - Wiktor Stribiżew\d
和[0-9]
是完全相同的... http://uploads.im/9Bc8Y.png - Shafizadeh\d
。 - Thomas Ayoub