我正在尝试使用 bash 中可用的扩展正则表达式运算符(?、*、+、@、!)。手册说我只需要用括号括起来一个模式列表,然后在左括号之前使用运算符。因此,如果我想要零个或多个 a 的模式:
if [[ "$1" =~ *(a) ]]
then
echo $1
fi
但这不起作用。我究竟做错了什么?
每man bash
:
额外的二元运算符 ,
=~
可用,其优先级与==
和相同!=
。使用时,运算符右侧的字符串被视为扩展正则表达式并进行相应匹配(如 regex(3)中)。如果字符串与模式匹配,则返回值为 0,否则为 1。如果正则表达式在语法上不正确,则条件表达式的返回值为 2。如果nocasematch
启用了 shell 选项,则不考虑字母字符的大小写进行匹配。可以引用模式的任何部分以强制将其作为字符串匹配。正则表达式中带括号的子表达式匹配的子字符串保存在数组变量中BASH_REMATCH
. 索引为 0的元素BASH_REMATCH
是字符串中匹配整个正则表达式的部分。BASH_REMATCH
索引为 n的元素是字符串中匹配第n个带括号的子表达式的部分。
我在这里引用了整件事,因为我认为了解它很有用。您在右侧使用标准 POSIX 扩展正则表达式。
特别是,右侧的表达式可能匹配左侧操作数的子字符串。因此,要匹配整个字符串,请使用^
和$
锚点:
if [[ "$1" =~ ^a*$ ]]
then
echo $1
fi