Shell如何判断IP的合法性?
要解决Linux下判断IP的合法性问题,老规矩,先进行问题分解。这个问题可以分解为:
判断给出的IP是否为4段由'.'分隔的数字组合
限制每个数字组合的大小在0-255之间
多说一句:检测IP的合法性的算法在网上一搜一大把,一篇文章抄来抄去。但都是甩出一大堆代码来没有很具体的解释,看上去很方便,但是对参照学习的人一点好处都没有,囫囵吞枣,抄完了还是啥都不会。
第一步我们先实现“判断给出的IP是否为4段由'.'分隔的数字组合”的目标一、Linux bash shell编程的时候遇到这种需要检测格式的问题,首先就要想到正则表达式。下面我先逐步用组合的方式来构造我们需要的正则表达式:
正则表达式匹配固定模式的字符串的时候,我们首先安排一个标记字符串开头和结尾的模式;^和$。^代表字符串的开头位置,$代表字符串的结尾位置,在它们中间的部分就是用来匹配字符串的内容:
IP_PATTERN=“^$”0~255这样一个数字用正则表达式的语言来说就是:0-9的数字最少匹配1次,最多匹配3次。分隔的“.”符号需要使用转义字符,因为“.”在正则表达式中代表除“ \n”之外的任何单个字符,按照IP的格式我们构造4段0~255的数字,加上前面的开始结束符号,就是这个样子:
IP_PATTERN=“^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$”二、根据正则表达式判断IP是否“合规”可以使用if条件判断
if [ $IP=~ $IP_PATTERN ]也可以使用grep语句加上-E参数
echo $IP | grep -E $IP_PATTERN使用grep语句看一下我们构造的正则表达式的效果:
可以看到已经达到我们的要求,下一步要想办法限制每段数字的范围在0~255之间。
第二步,限制数字的范围在0~255之间因为有了上一步初步的过滤,能够通过“考验”的合规字符串都是
XXX.XXX.XXX.XXX
这种形式。所以这里我们使用awk语句,将'.'看做域分隔符,把这4个数字分隔开之后分别提取进行输出。前面的正则表达式已经能够保证每个数字都是非负的,所以不需要判断≥0的情况:
echo $FILTERED_IP | awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "This IP is valid."}'如果每一段的数字都在0~255之间,就会打印This IP is valid.。
最终效果拿几个字符串来试一下效果:
192.168.1.1
192.168.1.1.1
192.168.1.a
192.168.1.278
可以看到能够实现我们需要的效果。
写成一行就是:
echo $IP | grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$"|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "This IP is valid."}'总结一下:“尽信书不如无书”,各种实例在网上确实可以信手拈来,但是“拿来主义”导致的后果就是学不到东西。所以遇到shell编程的问题,先不要慌,跟着我来,老规矩,先问题分解。
如果我的回答对你有点价值,请莫忘点赞加关注,谢谢!欢迎在评论区发表各种意见。
本文为作者原创,严禁转载,违者必究。