stecog
stecog

Reputation: 2344

Matching a string against contents of an array with regex operator not working

i make a simply bash script to change number version based on the source branch of a merge request, i need increment different value if a feature or a hotfix/bigfix/fix branches names:

#!/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

I've declared two arrays, FEATURE_LIST that contain only feature and work, if i type ./script.sh feature or ./script.sh feature/foobar it increase the value, instead if i type ./script.sh hotfix or other values combinations of array HOTFIX_LIST nothing happened. Where the error?

Upvotes: 1

Views: 145

Answers (1)

Inian
Inian

Reputation: 85580

Using .*${HOTFIX_LIST[*]}.* is quite a tedious way of representing a string for an alternate match for the regex operator in bash. You can use the | character to represent alternations (because Extended Regular Expressions library is supported) in bash regex operator.

First generate the alternation string from the array into a string

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

The string now represents a regex pattern comprising of three words that will match exactly as is because of the anchors ^ and $.

You can now use this variable in your regex match

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

also for the feature check, just put the whole array expansion with [*] on the RHS which would be sufficient. Also you don't need the greedy matches, since you have the longer string on the LHS the comparison would still hold good.

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

As a side note, always use lower case variable names for user variables. The uppercase names are reserved only for the variables maintained by the shell which are persistent and have special meaning.

Upvotes: 2

Related Questions