首页 > 解决方案 > 使用正则表达式运算符将字符串与数组的内容进行匹配不起作用

问题描述

我制作了一个简单的 bash 脚本来根据合并请求的源分支更改编号版本,如果功能或修补程序/bigfix/fix 分支名称,我需要增加不同的值:

#!/bin/bash

if [  $# -eq 0 ]
then
    echo -e "\nUsage: $0 MERGE_REQUEST_SOURCE\n"
    exit 1
fi

if [ ! -f version ]; then
    echo "0.0.0" > version
fi

VERSION=$(cat version)
MERGE_REQUEST_SOURCE=$1
declare -a FEATURE_LIST=("feature")
declare -a HOTFIX_LIST=("fix" "hotfix" "bugfix")

IFS="."
read -a num <<< ${VERSION}
MAJOR=${num[0]}
FEATURE=${num[1]}
HOTFIX=${num[2]}

if [[ ${MERGE_REQUEST_SOURCE} =~ .*${FEATURE_LIST[*]}.* ]]; then
    FEATURE=$((${FEATURE}+1))
    echo "${MAJOR}.${FEATURE}.${HOTFIX}" > version
elif [[ ${MERGE_REQUEST_SOURCE} =~ .*${HOTFIX_LIST[*]}.* ]]; then
    HOTFIX=$((${HOTFIX}+1))
    echo "${MAJOR}.${FEATURE}.${HOTFIX}" > version
else
    echo -e "Nothing change, exit."
    exit 0
fi

我已经声明了两个数组,FEATURE_LIST它们只包含feature并且可以工作,如果我键入./script.sh feature./script.sh feature/foobar它增加值,而不是如果我键入./script.sh hotfix或数组的其他值组合HOTFIX_LIST没有发生任何事情。哪里出错了?

标签: bash

解决方案


对于. .*${HOTFIX_LIST[*]}.*_ bash您可以在正则表达式运算符中使用该|字符来表示交替(因为支持扩展正则表达式库) 。bash

首先将数组中的交替字符串生成为字符串

hotfixList=$(IFS="|"; printf '^(%s)$' "${HOTFIX_LIST[*]}")
echo "$hotfixList"
^(fix|hotfix|bugfix)$

该字符串现在表示由三个单词组成的正则表达式模式,由于锚点^$.

您现在可以在正则表达式匹配中使用此变量

[[ ${MERGE_REQUEST_SOURCE} =~ $hotfixList ]]

同样为了feature检查,只需将整个阵列扩展[*]放在 RHS 上就足够了。此外,您不需要贪婪匹配,因为 LHS 上的字符串较长,比较仍然有效。

[[ ${MERGE_REQUEST_SOURCE} =~ ${FEATURE_LIST[*]} ]]

附带说明一下,始终为用户变量使用小写的变量名。大写名称仅保留给由 shell 维护的具有特殊含义的变量。


推荐阅读