我需要bash来检查CI_COMMIT_REF_NAME
是否匹配字符串master
,或者像1.3.5
,1.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