#!/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。
数组名的REMATCH位BASH_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)
您应该阅读该[[ 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一样!=。它与右侧字符串中的实际正则表达式无关。