在 bash 的 if 子句中使用正则表达式

在 bash 的 if 子句中使用正则表达式

看看这个 if 块:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

这应该打印“匹配”,但事实并非如此。我哪里错了?

答案1

您需要删除正则表达式匹配中的引号。

if [[ ${str} =~ m\.m ]]; then

从 bash 手册页:

[...] 可以使用附加的二元运算符 =~,其优先级与 == 和 != 相同。使用时,运算符右侧的字符串被视为扩展正则表达式并进行相应匹配(如 regex(3) 中)。如果字符串与模式匹配,则返回值为 0,否则返回值为 1。如果正则表达式在语法上不正确,则条件表达式的返回值为 2。如果启用了 shell 选项 nocasematch,则执行匹配时不考虑字母字符的大小写。 模式的任何部分都可以被引用以强制将其作为字符串进行匹配。

因此,对于引号,您正在使用古老的字符串匹配。

如果您需要在模式中使用空格,只需转义它们即可:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then

相关内容