代码之家  ›  专栏  ›  技术社区  ›  hellb0y77

检查数组是否包含bash中的字符串

  •  1
  • hellb0y77  · 技术社区  · 6 年前

    我制作了一个简单的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 如果我键入 ./script.sh hotfix HOTFIX_LIST 什么都没发生。哪里出错了?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Inian    6 年前

    .*${HOTFIX_LIST[*]}.* 对于中的regex操作符,表示替换匹配的字符串是一种相当繁琐的方法 bash . 你可以用 | 猛击 正则表达式运算符。

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

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

    字符串现在表示一个regex模式,由三个单词组成,由于锚定,它们将完全匹配 ^ $ .

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

    同样适用于 feature [*] 在右驾上就足够了。另外,你不需要贪婪的匹配,因为你在LHS上有更长的字符串,比较仍然有效。

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

    作为旁注, 总是