我制作了一个简单的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
的其他值组合没有任何反应。错误在哪里?
答案 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维护的,具有持久性并具有特殊含义的变量。