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