Bash:使用正则表达式检查字符串是否看起来像由三部分组成的版本号



我需要bash来检查CI_COMMIT_REF_NAME是否匹配字符串master,或者像1.3.51.1.11等三部分版本号匹配。

这是我尝试过的:

#!/bin/bash
CI_COMMIT_REF_NAME=1.1.4
if [ $CI_COMMIT_REF_NAME == 'master' ] || [[ $CI_COMMIT_REF_NAME =~ ^([0-9]{1,2}.){2}[0-9]{1,2}$ ]]
then 
echo "true"
else 
echo "false"
fi

预期的输出是true,但我得到false.将变量设置为master按预期工作,因此错误一定是我的正则表达式。

我做错了什么?

您需要将正则表达式声明为单引号内的单独变量,然后在 bash 中解析正则表达式不会有问题,并确保括号放在[0-9]{1,2}.部分周围:

rx='^([0-9]{1,2}.){2}[0-9]{1,2}$'
if [ $CI_COMMIT_REF_NAME == 'master' ] || [[ $CI_COMMIT_REF_NAME =~ $rx ]]

观看在线 Bash 演示

现在,模式匹配:

  • ^- 字符串的开头
  • ([0-9]{1,2}.){2}- 出现 2 次 1 或 2 位数字,后跟文字点
  • [0-9]{1,2}- 1 或 2 位数字
  • $- 字符串的结尾。

您可能不希望将行首匹配两次:

$ CI_COMMIT_REF_NAME=1.1.4
$ [[ $CI_COMMIT_REF_NAME =~ (^[0-9]{1,2}.){2}[0-9]{1,2}$ ]] && echo match
$ [[ $CI_COMMIT_REF_NAME =~ ^([0-9]{1,2}.){2}[0-9]{1,2}$ ]] && echo match
match

最新更新