bash - 正则表达式中的匹配括号在 bash 中不起作用

标签 bash function arguments glob

我定义了一个函数,如果其第一个参数包含 abc,则打印 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 正则表达式规范部分:

  1. [...] 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/

相关文章:

linux - 如何在代码块之间插入等待

linux - bash 脚本中带有空格的基本名称?

javascript - React Native setState 不是函数

python - 如何打印出 Python 函数需要/允许哪些参数?

c# - 如何获取 Form 程序的参数?

python - 参数与参数?最后,它们是什么?

bash - 在 csv 文件中查找列的索引号,但命令不显示结果?

linux - 使用 bash 以特定方式输出文本文件的值?

c++ - 在 Win32 C++ 中调用未导出的函数

php - 运行一个没有点击功能的jquery