使用正则表达式运算符无法将字符串与数组内容匹配

时间:2019-04-19 10:14:44

标签: bash

我制作了一个简单的bash脚本,以根据合并请求的源分支更改数字版本,如果某个功能或hotfix / 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,它将增加该值,而如果我键入{ {1}}或数组./script.sh hotfix的其他值组合没有任何反应。错误在哪里?

1 个答案:

答案 0 :(得分:2)

使用.*${HOTFIX_LIST[*]}.*是一种很繁琐的方式,用来表示bash中正则表达式运算符的替代匹配字符串。您可以在| regex运算符中使用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维护的,具有持久性并具有特殊含义的变量。