如何让Bash脚本仅匹配指定格式的带括号字符串
Bash脚本正则匹配修正问题
需求说明
需要Bash脚本的if条件仅在输入符合以下两种格式时返回true:
QUAL(12345):Some Message
PROD(45678):Some Message
现有问题
当前代码能匹配上述预期格式,但会误匹配以下非预期场景:
QAULIC(12345):Some Message
PROD34dikek(12345):Some Message.
用户现有代码
#!/bin/bash set -x jiraid=$(echo "$1" | awk -F'[\(\)]' '{print $2}') if [[ "$1" =~ ^QUAL* ]] || [[ "$1" =~ ^PROD* ]] && [[ $jiraid =~ ^-?[0-9]+$ ]] then echo "Run Pipeline" fi
修正方案
现有代码的问题在于正则写法错误(QUAL*会模糊匹配QUA加任意数量的L,未限定后续必须紧跟(),同时逻辑运算符优先级导致判断逻辑不符合预期。修正后的代码可以用单个完整正则完成格式校验,同时高效提取验证ID:
#!/bin/bash set -x if [[ "$1" =~ ^(QUAL|PROD)\(([0-9]+)\):.*$ ]]; then jiraid="${BASH_REMATCH[2]}" echo "Run Pipeline" fi
修正说明
- 正则精准匹配:
^(QUAL|PROD)限定字符串必须以QUAL或PROD开头;\(([0-9]+)\)匹配紧跟的括号与纯数字ID;:.*$匹配冒号及后续任意内容 - 逻辑简化:单个正则完成全格式校验,避免原代码中
||与&&优先级混乱的问题 - 高效提取ID:通过
BASH_REMATCH数组直接获取正则捕获的数字ID,无需额外调用awk
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

