Bash 测试:“=~”起什么作用?

Bash 测试:“=~”起什么作用?
#!/bin/bash
INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

echo "INT is an integer."

else

echo "INT is not an integer." >&2

exit 1

fi

~起始正则表达式中的前导有什么作用?

答案1

实际上~是运算符的一部分=~,它执行左侧字符串与其右侧扩展正则表达式的正则表达式匹配。

[[ "string" =~ pattern ]]

请注意,字符串应该加引号,而正则表达式不应该加引号(除非您想匹配文字字符串)。

Perl 编程语言和其他几种通用和特定领域语言中使用类似的运算符来执行正则表达式匹配。

所理解的正则表达式与GNU所理解的带有flag的正则表达式bash相同,即正则表达式的扩展集。grep-E


有点偏离主题,但很高兴知道:

当与包含捕获组的正则表达式进行匹配时,每个组捕获的字符串部分在数组中可用BASH_REMATCH。该数组中的第零/第一个条目对应于的替换命令(或Perl)&的替换模式,它是与该模式匹配的字符串的位,而索引 1 及以后的条目对应于,等替换模式中的 . (或Perl中的 等),即每个括号匹配的位。sed$&\1\2sed$1$2

例子:

string=$( date +%T )

if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
  printf 'Got %s, %s and %s\n' \
    "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi

这可能会输出

Got 09, 19 and 14

如果当前时间恰好是 09:19:14。

REMATCH数组名的bit来自BASH_REMATCH“正则表达式匹配”,即“RE-Match”。


在非类bashBourne shell 中,也可以用于expr有限的正则表达式匹配(仅使用基本正则表达式)。

一个小例子:

$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123

答案2

您应该阅读 参考资料 部分下的 bash 手册页[[ expression ]]

An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).

长话短说,=~是一个运算符,就像==and 一样!=。它与其右侧字符串中的实际正则表达式无关。

相关内容