shell:=~ 运算符不能按预期工作

so.*_*red 2 bash regular-expression test

考虑以下脚本:

#! /bin/bash

line="confusing"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi
Run Code Online (Sandbox Code Playgroud)

虽然以上产生了预期的结果,但以下不会:

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:lower:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi
Run Code Online (Sandbox Code Playgroud)

这会打印“匹配!”
我很迷惑; 正则表达式不是[[:lower:]]*表示零个或多个小写字母吗?

当以下内容也打印“matches!”时,它会变得更加混乱。

#! /bin/bash

line="CoNfUsInG"

if [[ $line =~ [[:digit:]]* ]]
then
    echo "matches!"
else
    echo "does not match."
fi
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会发生这种情况?

cho*_*oba 10

正则表达式不必匹配整个字符串。这就是为什么你有^和 分别$用于字符串的开头和结尾。

[[ CoNfUsInG =~ ^[[:lower:]]*$ ]] || echo no
Run Code Online (Sandbox Code Playgroud)

混淆,^[[:lower:]]*(没有$)仍然匹配,因为在字符串的开头有零个小写字母。