bash扩展了正则表达式运算符

Kev*_*RGT 1 regex bash

我试图使用bash中可用的扩展正则表达式运算符(?,*,+,@ ,!).手册说我只需用括号括起一个模式列表,然后在左括号前使用操作符.所以,如果我想要一个零或更多的模式:

if [[ "$1" =~ *(a) ]]
then
   echo $1
fi
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我究竟做错了什么?

nne*_*neo 7

每个man bash:

可以使用另一个二元运算符=〜,其优先级与==和!=相同.使用它时,操作符右侧的字符串被视为扩展正则表达式并相应地匹配(如在regex(3)中).如果字符串与模式匹配,则返回值为0,否则返回1.如果正则表达式在语法上不正确,则条件表达式的返回值为2.如果启用了shell选项nocasematch,则执行匹配而不考虑字母字符的情况.可以引用模式的任何部分以强制它作为字符串匹配.与正则表达式中带括号的子表达式匹配的子字符串保存在数组变量BASH_REMATCH中.索引为0的BASH_REMATCH元素是与整个正则表达式匹配的字符串部分.索引为n的BASH_REMATCH元素是与第n个带括号的子表达式匹配的字符串部分.

我在这里引用了所有内容,因为我认为知道它是有用的.您在右侧使用标准POSIX扩展正则表达式.

特别是,右侧的表达式可能与左操作数的子字符串匹配.因此,为了匹配整个字符串,使用=~==锚点:

if [[ "$1" =~ ^a*$ ]]
then
    echo $1
fi
Run Code Online (Sandbox Code Playgroud)