我定义了一个函数,如果其第一个参数包含 a
、b
或 c
,则打印 yes
:
$ func() { [[ $1 =~ [abc] ]] && echo yes; }
$ func xyz
$ func xaz
yes
$ func xbz
yes
$ func xcz
yes
现在我想检测 [
, ]
或 *
所以我尝试了:
func() { [[ $1 =~ [\[\]*] ]] && echo yes; }
$ func x*z
$ func x[z
$ func x]z
yes
这似乎只适用于]
。我还尝试 set -f
禁用全局扩展,但得到了相同的结果。
最佳答案
BRE/ERE Bracketed Expression 中对此行为进行了很好的解释。 POSIX 正则表达式规范部分:
- [...] The right-bracket (
']'
) shall lose its special meaning and represent itself in a bracket expression if it occurs first in the list (after an initial circumflex ('^'
), if any). Otherwise, it shall terminate the bracket expression, unless it appears in a collating symbol
这意味着,您的 ]
需要出现在括号表达式的开头,可能位于 ^
之后,而不是表达式后面的任何位置。这是一种特殊情况,仅适用于 ]
,但不适用于 [
,它会丢失括号表达式内的特殊字符。
如此定义
[[ $1 =~ [][*] ]]
应该按预期工作,因为开头的 ]
并没有终止括号表达式。禁用全局扩展在这里没有任何影响,因为括号表达式内的 *
没有特殊含义,仅按字面意思处理。
关于bash - 正则表达式中的匹配括号在 bash 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58989812/