论点:IF判断—多层意思的多条件判断应该每层意思进行判断,逻辑分层。
论点解释:
材料:需要对输入的IP进行判断是否合法。如何进行条件判断?
分解:
1、IP要满足最小最大长度。
2、点分十进制除点之外的4部分都不能为空。
3、点分十进制除点之外的4部分都只能是【0-9】组成的复合数字。
4、点分十进制除点之外的4部分,每部分值必须小于255。
分析:只要1-4条件满足理论上应该是合法的IP了。不考虑其它判断和字符串分解操作,若通过1 个if语句来达到合法IP的判断:
假设:输入IP为x,拆分的4部分为a b c d,
那么1个if判断写法:
if [ x -ge 7 ] && [ x -le 15 ] && [ a ] && [ b ] && [ c ] && [ d ] &&\
! ( echo a | grep -q '[^0-9]' ) && ! ( echo b | grep -q '[^0-9]') && ! ( echo c | grep -q '[^0-9]') \
&& ! ( echo d | grep -q '[^0-9]') && [ a -lt 255 ] && [ b -lt 255 ] && [ c -lt 255 ]\
&& [ d -lt 255 ] ;then
echo -e "a.b.c.d 是合法IP\n"
fi
上面只是为了表示大概意思, 这种写法! ( echo b | grep -q ‘[^0-9]’)肯定不对,括号和!代表里面 的内容取反,if [ ] && echo b | grep -q ‘[^0-9]’ 这种组合的形式报错,只能用2种中的一种。
那么多层意思多个if判断写法:
flag=0
while [ $flag -eq 0 ];do
read -p "请输入合法的IP: " a.b.c.d
x=`echo {#{a.b.c.d}}`
if [ x -ge 7 ] && [ x -le 15 ];then
if [ a ] && [ b ] && [ c ] && [ d ] ;then
if ! ( echo a | grep -q '[^0-9]' ) && ! ( echo b | grep -q '[^0-9]') \
&& ! ( echo c | grep -q '[^0-9]') && ! ( echo d | grep -q '[^0-9]');then
if [ a -lt 255 ] && [ b -lt 255 ] && [ c -lt 255 ] && [ d -lt 255 ] ;then
echo -e "a.b.c.d 是合法IP\n"
flag=1
fi
fi
fi
fi
done
上面只是为了表示大概意思, 这种写法! ( echo b | grep -q ‘[^0-9]’)肯定不对,括号和!代表里面 的内容取反,if [ ] && echo b | grep -q ‘[^0-9]’ 这种组合的形式报错,只能用2种中的一种。
通过对比可以看到多个if的写法逻辑结构层次更清晰,便于阅读和理解。建议1层意思的多个条件判断可以用1个if来表达,多层意思如果用1个if来表达给人意思表达过多,又不是1个层面,严重影响代码的理解。应该复杂问题简单化,逻辑分层更易于理解。
下面是完整的合法IP判断脚本:
#!/bin/bash
read -p "
如果你选的服务器类型为2,请输入内网映射到公网的外网IP: " ip_addr
echo -e "\n"
#echo ${#ip_addr} 求变量长度
flag=0
while [ $flag -eq 0 ];do
flag=1
section1=""
section2=""
section3=""
section4=""
section1=`echo $ip_addr|awk -F '.' '{print $1}'`
section2=`echo $ip_addr|awk -F '.' '{print $2}'`
section3=`echo $ip_addr|awk -F '.' '{print $3}'`
section4=`echo $ip_addr|awk -F '.' '{print $4}'`
if [ $flag -eq 1 ];then
if [ ${#ip_addr} -lt 7 ] || [ ${#ip_addr} -gt 15 ];then
read -p "
你输入了错误的IP长度!请重新输入标准类型x.x.x.x的IP:" ip_addr
flag=0
fi
fi
if [ $flag -eq 1 ];then
if [ ! $section1 ] || [ ! $section2 ] || [ ! $section3 ] || [ ! $section4 ];then
read -p "
你输入了错误的IP格式!请重新输入标准类型x.x.x.x的IP:" ip_addr
flag=0
fi
fi
if [ $flag -eq 1 ];then
if echo $section1 | grep -q '[^0-9]' || echo $section2 | grep -q '[^0-9]' \
|| echo $section3 | grep -q '[^0-9]'||echo $section4 | grep -q '[^0-9]';then
read -p "
你输入了错误的IP,请输入数字和'.'!请重新输入标准类型x.x.x.x的IP:" ip_addr
flag=0
fi
fi
if [ $flag -eq 1 ];then
if [ $section1 -ge 255 ] || [ $section2 -ge 255 ] || [ $section3 -ge 255 ] || [ $section4 -ge 255 ];then
read -p "
你输入了错误的IP,数字需要小于255!请重新输入标准类型x.x.x.x的IP:" ip_addr
flag=0
fi
fi
done
echo $ip_addr