为什么 bash 中的正则表达式只有当它是变量而不是直接时才起作用?

为什么 bash 中的正则表达式只有当它是变量而不是直接时才起作用?

那么为什么下面的工作会打印出匹配项:

THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
    echo "Match!"
fi

但以下情况则不然:

if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
    echo "Match!"
fi  

有什么不同?这是相同的正则表达式

答案1

不要在里面使用单引号[[

if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
    echo "Match!"
fi

来自 GNU bash 手册: https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs

特别注意:

模式的任何部分都可以被引用以强制引用部分作为字符串进行匹配

该手册似乎建议首选使用该变量:

将正则表达式存储在 shell 变量中通常是避免引用 shell 特有字符时出现问题的有用方法。有时很难在不使用引号的情况下按字面指定正则表达式,或者在注意 shell 的引号删除的同时跟踪正则表达式使用的引号。使用 shell 变量来存储模式可以减少这些问题。

也可以看看将正则表达式存储在 shell 变量中如何避免引用 shell 特有字符的问题?

相关内容