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

rag*_*rok 60 bash test

#!/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
Run Code Online (Sandbox Code Playgroud)

前导~在起始正则表达式中做什么?

Kus*_*nda 78

~实际上是操作者的一部分=~,其执行将字符串其左侧到其右边的扩展正则表达式的正则表达式匹配。

[[ "string" =~ pattern ]]
Run Code Online (Sandbox Code Playgroud)

请注意,字符串应该被引用,并且正则表达式不应该被引用。

Perl 编程语言中使用了类似的运算符。

其理解的正则表达式bash与GNUgrep理解的带有-E标志的正则表达式相同,即正则表达式的扩展集。


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

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

例子:

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
Run Code Online (Sandbox Code Playgroud)

这可能会输出

Got 09, 19 and 14
Run Code Online (Sandbox Code Playgroud)

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

数组名的REMATCHBASH_REMATCH来自“Regular Expression Match”,即“RE-Match”。


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

一个小例子:

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

  • 它与 `grep -E` 仅在 GNU 系统上理解的内容相同,并且仅在使用不带引号的变量作为模式 `[[ $var = $pattern ]]` 时(参见 `[[ 'ab' =~ a\sb ] ]` vs `p='a\sb'; [[ 'ab' =~ $p ]]`)。还要注意,shell 引用会影响 RE 运算符的含义,并且需要引用某些字符来进行 shell 标记,这可能会影响 RE 处理。`[[ '\' =~ [\/] ]]` 返回 false。`ksh93` 有更严重的问题。请参阅 `zsh`(或 bash 3.1)以获得更明智的方法,其中 shell 和 RE 引用明显分开。`zsh` 和 `yash` 内置的 `[` 也有一个 `=~` 操作符。 (2认同)

Sok*_*kel 7

您应该阅读该[[ expression ]]部分下的 bash 手册页。

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一样!=。它与右侧字符串中的实际正则表达式无关。

  • @Sokel 对于某些人来说,“RTFM”说起来容易做起来难。⋯ `man [[ expression ]]` 和 `man [[` 什么都不返回。`help [[` 返回有用的信息——因为 `[[` 是一个内部 bash 命令——但没有说明 `=~` 是使用基本的还是扩展的正则表达式语法。⋯ 你引用的文字来自**bash** 手册页。我知道您说的是“阅读 bash 手册页”,但一开始,我以为您的意思是阅读 bash 中的手册页。无论如何,`man bash` 返回一个巨大的文件,它有 4139 行(72 页)长。可以通过按 `/▒▒▒` 来搜索它,它需要一个正则表达式,它的风格——比如 `=~` - 没有指定。 (3认同)