检测参数中的特殊字符

问题描述 投票:0回答:2

我定义了在第一个参数中检测到abc的函数:

$ 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禁用全局扩展,但得到了相同的结果。

bash function arguments glob
2个回答
0
投票

找到了解决方案,但我不知道为什么旧模式无法正常工作:

func() { [[ $1 =~ [\]\[*] ]] && echo yes; }

我将模式从[\[\]*]更改为[\]\[*]


0
投票

此行为在POSIX regex规范的BRE/ERE Bracketed Expression部分中得到了很好的解释:

  1. [...]右括号(']')将失去其特殊的含义,并且如果它在列表中首先出现(在首个抑扬符号('^'之后,如果有的话),则应在方括号表达式中表示自己。否则,除非括号中出现校对符号,否则它将终止方括号表达式]

这意味着,]必须出现在方括号表达式的开头,可能在^之后,而不是表达式的后面。这是一种特殊情况,仅适用于],但不适用于[,后者在方括号表达式内丢失其特殊字符。

因此定义

[[ $1 =~ [][*] ]]

应该按预期工作,因为开头的]没有终止括号表达式。

© www.soinside.com 2019 - 2024. All rights reserved.