当我在 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 中使用这是正则表达式,但我相信语法是相同的。如果没有,请告诉。