为什么 bash 中的正则表达式仅在它是变量而不是直接时才有效?

Jim*_*Jim 4 bash string shell-script regular-expression

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

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

但以下不:

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

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

jw0*_*013 10

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

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

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

特别注意:

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

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

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

另请参见将正则表达式存储在 shell 变量中如何避免引用 shell 特有的字符时出现问题?


归档时间:

查看次数:

5332 次

最近记录:

7 年,7 月 前