IF判断-----多层意思的多条件判断应该每层意思进行if判断

本文讨论了在进行多条件判断时,尤其是合法IP判断,应该每层意思单独进行IF判断以实现逻辑分层。通过举例说明,指出将多个判断条件合并到一个IF语句中可能造成理解和维护困难,建议采用多个独立的IF语句以提高代码的可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论点: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值