bash - 使用正则表达式运算符将字符串与数组的内容进行匹配不起作用
问题描述
我制作了一个简单的 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
没有发生任何事情。哪里出错了?
解决方案
对于. .*${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 维护的具有特殊含义的变量。
推荐阅读
- javascript - 如何返回一个对象数组,每个对象有多少个计数
- haskell - Haskell 有界数据类型,由 value-bounds 构造
- java - Java 编译没有错误,运行第一行,然后不继续或结束
- php - 来自 ajax 调用的未定义 PHP 输出
- wordpress - 无法删除“帖子首先出现”RSS
- flutter - 输入'未来
' 不是类型 'bool' shared_preferences 的子类型 - java - 如何从给定的一组日期中找到每个月的最少日期
- python - 在 groupby 对象上扩展均值
- laravel - 从具有特定键、值对的集合中获取项目并将其从 laravel 中的原始集合中删除的方法
- c++ - QGroupBox 如何支持 HTML?