如何使用 bash(3.2.25) 的 一个额外的二元运算符:=~



当我在 rhel5.5 上阅读 bash(3.2.25) 的信息时,我对如何使用"=~"感到困惑

# match the IP, and return true
[kevin@server1 shell]# [[ 192.168.1.1 =~ "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$" ]] && echo ok || echo fail
ok

# add double qoute
# return false, en ... I know.
[kevin@server1 shell]# [[ 192.168 =~ "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$" ]] && echo ok || echo fail
fail
# remove double qoute
# return ture ? Why ?
[kevin@server1 shell]# [[ 192.168 =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]] && echo ok || echo fail
ok 

那么,我应该在运算符的右侧查询字符串吗?
以及为什么第二个命令返回 true,显然它应该返回 false!

以下是信息的内容:

一个额外的二元运算符,=~', is available, with the same precedence as ==' 和 !='. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex3)). The return value is 0 if the string matches the pattern, and 1 otherwise. If the regular expression is syntactically incorrect, the conditional expression's return value is 2. If the shell option nocasematch' (请参阅shopt' in *Note Bash Builtins::) is enabled, the match is performed without regard to the case of alphabetic characters. Substrings matched by parenthesized subexpressions within the regular expression are saved in the array variable BASH_REMATCH的描述。 具有索引 N 的 BASH_REMATCH' with index 0 is the portion of the string matching the entire regular expression. The element of BASH_REMATCH' 元素是 与第 N 个括号子表达式匹配的字符串部分。

处理正则表达式模式的推荐、最广泛兼容的方法是用单引号单独声明它们:

$ re='^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$'
$ [[ 192.168.1.1 =~ $re ]] && echo ok || echo fail 
ok
$ [[ 192.168 =~ $re ]] && echo ok || echo fail 
fail

关于bash版本之间行为差异的一些讨论可以在Greg的Wiki上找到 - 带回家的信息是使用不带引号的变量是最好的方法。

与运算符本身无关,但是,您的正则表达式不会将匹配的 IP 地址的每个字节限制为 0-255 之间。该正则表达式将接受 IP,例如:

999.999.999.999。

请考虑使用以下方法:

^(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|2[0-4]\d|25[0-5])$

这将在 0.0.0.0 和 255.255.255.255 之间匹配。我在 java 中使用这是正则表达式,但我相信语法是相同的。如果没有,请告诉。

相关内容

  • 没有找到相关文章

最新更新