2010年(11)
分类:
2010-08-21 15:34:19
我的思路
1最简单的当然是这样 可以工作 而且可以应付大部分情况了
if [[ "${!temp}" =~ \
"^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" ]]
缺点很明显 因为ip 地址是0~255的 而不是0~999
2那么这样写
[0-2]?[0-5]?[0-5]? 那么? 代表的是0个或者1个数字 有可能?要加转义符\
那么 这样写问题更大
首先没有数字的时候 比如.7.8.9这样 居然通过了 这样不行
其次66 这样的数字报错
3所以改写为
(2[0-5][0-5]|1[0-9][0-9]|[1-9]?[0-9]) 用 (1|2|3)这种格式
表示3种情况
第一种是200多 范围200 ~255
第二种为100多 范围100~199
第三种为十位数和个位数的情况 之所以为1-9而不是0-9 为十位数
是因为 如果是0的话 那么 用0个[1-9]即可代表
范围为 0~99
问题不少
2[0-5][0-5] 那么 249这样的就不存在了
必须分解2[0-4][0-9]|25[0-5] 这2种
最终为(2[0-4][0-9]|25[0-5] |1[0-9][0-9]|[1-9]?[0-9])
如果扩展为1.2.3.4形式
那么应该写为
regex_ip="(2[0-4][0-9]|25[0-5] |1[0-9][0-9]|[1-9]?[0-9])(\.(2[0-4][0-9]|25[0-5] |1[0-9][0-9]|[1-9]?[0-9])){3}"
意思是 (0-255)(点号 0-255)3次
实验一下
#!/bin/bash
#对ip的正则表达式匹配
regex_ip="(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])(\.(2[0-4][0-9]|25[0-5]|1[0-9][0-9]|[1-9]?[0-9])){3}"
echo "123.1.1.1" |grep -E "$regex_ip"
注意1 因为用到了扩展正则 () | 和?所以 grep必须加 –E
如果是 if [[ =~ ]]模式就不用加什么参数了 都能识别的
2小心 不要乱加空格 有时候导致错误 就是因为一个不起眼的空格 导致全部出错
比如 刚才[0-5] |之间这个不起眼的空格 导致整个 表达式不对 在[[]] 出错
3 "^${regex_ip}$"这样写正确吗?
正确的 因为$结尾匹配必定是放在最后的 解释器分得清楚 前面的$是变量符号 因为它会根据这个符号抓后面的变量 而最后的$识别为正则表达式