栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

第二章、条件判断(if语句、case语句)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第二章、条件判断(if语句、case语句)

条件判断(if语句、case语句)

文章目录
  • 条件判断(if语句、case语句)
    • 一、条件判断
      • 1.文件测试–test
    • 二、if语句
      • 1、单分支
      • 2、双分支语句
      • 3、多分支结构
      • 4、嵌套if语句
    • 三、case

一、条件判断 1.文件测试–test

使用专门的测试工具一test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。
语法格式:
格式1: [ 操作符 条件表达式 ] ps:注意中括号和表达式中间需要隔至少一个空格式
格式2: test 操作符 条件表达
格式3: 支持正则表达式
格式4: 边界不需要空格,是效率最高的

语法
---关于某个⽂件名的『类型』侦测(存在与否),如 test -e filename
-e 该『⽂件名』是否存在?(常⽤) 
-f 该『⽂件名』是否为⽂件(file)?(常⽤) 
-d 该『⽂件名』是否为⽬录(directory)?(常⽤) 
-b 该『⽂件名』是否为⼀个 block device 装置?
-c 该『⽂件名』是否为⼀个 character device 装置?
-S 该『⽂件名』是否为⼀个 Socket ⽂件?
-p 该『⽂件名』是否为⼀个 FIFO (pipe) ⽂件?
-L 该『⽂件名』是否为⼀个连结档?

2. 关于⽂件的权限侦测,如 test -r filename
-r 侦测该⽂件名是否具有『可读』的属性?
-w 侦测该⽂件名是否具有『可写』的属性?
-x 侦测该⽂件名是否具有『可执⾏』的属性?
-u 侦测该⽂件名是否具有『SUID』的属性?
-g 侦测该⽂件名是否具有『SGID』的属性?
-k 侦测该⽂件名是否具有『Sticky bit』的属性?
-s 侦测该⽂件名是否为『⾮空⽩⽂件』?

3. 两个⽂件之间的⽐较,如: test file1 -nt file2
-nt (newer than)判断 file1 是否⽐ file2 新 -ot (older than)判断 file1 是否⽐ file2 旧 
-ef 判断 file2 与 file2 是否为同⼀⽂件,可⽤在判断 hard link 的判
定上。 主要意义在判定,两个⽂件是否均指向同⼀个 inode 哩!

4. 关于两个整数之间的判定,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 ⼤于 n2 (greater than)
-lt n1 ⼩于 n2 (less than)
-ge n1 ⼤于等于 n2 (greater than or equal)
-le n1 ⼩于等于 n2 (less than or equal)

5. 判定字符串的数据
test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为
true
test -n string 判定字符串是否⾮为 0 ?若 string 为空字符串,则为
false。
注: -n 亦可省略
test str1 = str2 判定 str1 是否等于 str2 ,若相等,则回传 true
test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false

6. 多重条件判定,例如: test -r filename -a -x filename
-a (and)两状况同时成⽴!例如 test -r file -a -x file,则 file 同
时具有 r 与 x 权限时,才回传 true。 
-o (or)两状况任何⼀个成⽴!例如 test -r file -o -x file,则 file
具有 r 或 x 权限时,就可回传 true。
! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

7.逻辑测试
&&   :前者成立并执行后者
||   :前者成立后者不执行,前者不成立,后者执行
!   :非

二、if语句 1、单分支
if 条件语句
	then 命令
fi

案例:比较3个数字的大小

#!/bin/bash
#定义交互式shell,连续提示用户输入3个数字,然后,三个数字比大小,最后要求echo从大到小排列(提示:注意1f语句及判断)
read -p "请输入一个整数:" numl
read -p "请输入一个整数:" num2
read -p "请输入一个整数:" num3
x=0
if [ $numl -gt $num2 ]
then
x=$numl
numl=$num2
num2=$x
fi

if [ $numl -gt $num3 ]
then
x=$numl
numl=$num3
num3=$x
fi

if [ $num2 -gt $num3 ]
then
x=$num2
num2=$num3
num3=$x
fi

echo "从大到小排序后数据为:$numl,$num2,$num3" 

2、双分支语句
if 条件语句
	then 命令1
	else 命令2
fi

案例

例:判断目标主机时否存活,存活就打印 is up,如果不存活就打印 is down

ping的选项:
-c:ping的次数
-i:每次多久ping一次,单位是秒
-W:反馈结果的时间,如果不通可加快反馈时间,单位是秒

[root@localhost ~]# vim 1.sh
#!/bin/bash                                ##基本格式
ip=192.168.113.125                         ##定义变量
ping -c 2 -i 0.1 -W 3 $ip &> /dev/null     ##ping测试,混合注入到黑洞中,不看结果
if [ $? -eq 0 ]                            ##返回值比较,意思就是 echo $?
then                      
   echo "$ip is up"                        ##ping通,成立输出 is up
else
   echo "$ip is down"                      ##ping不通,不成立输出 is down
fi
[root@localhost ~]# sh  1.sh               ##执行
192.168.113.125 is up                      ##成立ping的通输出 is up
192.168.113.341 is down                    ##不成立ping不通输出 is down

例:判断登陆的是否是管理员

[root@c7-1 ~]# vim 1.sh
#!/bin/bash
if [ $UID -eq 0 ];then
        echo "当前登陆用户是管理员root"
else
        echo "当前登陆用户不是管理员root"
fi
[root@c7-1 ~]# sh 1.sh 
当前登陆用户是管理员root
3、多分支结构
if 条件1
	then 命令1
	elif 条件2
		then 命令2
	else 命令3
fi

例:根据输入的考试分数不同来区分优秀,合格,不及格三个档次

[root@localhost ~]# vim 2.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" score
if [ $score -ge 85 ] && [ $score -le 100 ];then      //判断$score 是否大于等于85,小于等于100
        echo "$score 分,优秀"                        //条件满足则输出,不满足则继续往下进行判断
elif [ $score -ge 70 ] && [ $score -le 84 ];then
        echo "$score 分,合格"
elif [ $score -ge 0 ] && [ $score -le 69 ];then
        echo "$score 分,不及格"
else                                                //以上条件都不成立
        echo "请输入100以内的分数"
fi
[root@localhost ~]# sh 2.sh
请输入您的分数(0-100) 73 
73 分,合格
[root@localhost ~]# sh 2.sh
请输入您的分数(0-100) 1001
请输入100以内的分数
4、嵌套if语句
if 条件1
	then 命令1
	if 命令2
		then 命令2
	fi
fi

例子:判断用户是否有家目录,如没有询问是否删除用户

#!/bin/bash
read -p "请输入用户名:" user					//定义交互式变量
if grep $user /etc/passwd &>/dev/dull		//条件测试,判断是否有这个用户并输入给黑洞
then										//条件成立 则
        if [ -d /home/$user ]				//判断用户是否有家目录
        then								//若条件成立
                echo "该用户状态正常"			//输出状态正常
        else								//若以上条件都不成立
                read -p "该用户没有家目录,是否删除该用户,请输入[yes/no]:" ask	//定义交互式变量
                if [ $ask == yes ]			//判断输入的是不是yes
                then						//若条件成立
                        echo "正在删除用户。。。"		//输出
                        userdel $user &>/dev/null;sleep 2	//删除该用户并延迟两秒
                        echo "该用户已删除"			//输出

                elif [ $ask == no ]			//条件测试2,判断输入的是不是no
                then						//若条件成立
                        exit				//退出
                fi							//结束判断
        fi									//结束判断

else				//若以上条件都不成立
        echo "该用户不存在"	//输出一个该用户不存在
fi
三、case

case语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值

case 变量值 in
模式1)
 命令1
 ;;
模式2)
 命令2
 ;;
*)     ##其他模式
命令3
 ;;
esac

case语句的执行流程:首先使用"变量值"与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号";:"后跳转至esqc,表示结束分支:若与模式1不相匹配,则继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇见双分号“;;”后跳转至esac,表示结束分支依此类推,若找不到任何匹配的值,则执行默认模式*)”后的命令序列,直到遇见esqc后结束分支

案例

#!/bin/bash
#查看一周中某天的菜单
read -p "查看今天午餐菜单" week

case $week in
Monady)
	echo "今天午餐为XX"
	;;
Tuesday)
	echo "今天午餐为XX"
	;;
……
*)
	echo "输错啦,想屁吃"
	;;
esca

看你输入的内容属于什么类型

#!/bin/bash
read -p "请输入一个字符,按Enter确认: " key
case $key in
[a-z]|[A-Z])
 echo "你输入的是英文字母"
 ;;
[0-9])
 echo "你输入的是数字"
 ;;
 *)
 echo "你输入的是其他字符"
 ;;
esac

使用case 定义一个shell
要求:现学校举行运动会,100米5s-6s的为超人,100米 12-15s为优秀,100米 30s以上的为不及格,其他为意外

#!/bin/bash
read -p "请输入你的成绩:" s
[ $s -ge 5 -a $s -le 6 ] && a="超人"
[ $s -ge 12 -a $s -le 15 ] && a="优秀"
[ $s -ge 30 ] && a="不及格"

case $a in

超人)
echo "你的成绩为$s s,超人"
;;
优秀)
echo "你的成绩为$s s,优秀"
;;
不及格)
echo "你的成绩为$s s,不及格"
;;
*)
echo "是个意外,啦啦啦"
esac
---------or-----------

read -p "请输入你的成绩:" s

case $s in
[5-6])
echo "你的成绩为$s 秒,超人"
;;
1[2-5])
echo "你的成绩为$s 秒,优秀"
;;
[3-9][0-9]
echo "你的成绩为$s 秒,不及格"
;;
*)
echo "出现意外啦!"

esac

以上一题为基础,学校现发现统一管理并不合理,所以做出了调整
男生 100米 10-15s 为优秀 10s以下为运动员 30s 以上为不及格
女生 100米 11-16s 为优秀 11s以下为运动员 30s 以上为不合格

#!/bin/bash

read -p "请输入你的性别(女生输:1,男生输:2 )" gender
read -p "请输入你的成绩(单位:s):" result
while [ $gender==[1-2] ]
do
if [ $gender -eq 1 ]
 then
[ $result -ge 11 -a $result -le 16 ] && a="优秀"
[ $result -lt 10 ] && a="运动员"
[ $result -ge 30 ] && a="不及格"
case $a in
优秀)
echo "你的成绩为$result s,优秀"
break
;;
运动员)
echo "你的成绩为$result s,运动员"
break
;;
不及格)
echo "你的成绩为$result s,不及格"
break
;;
*)
echo "是个意外,啦啦啦"
break
esac

elif [ $gender -eq 2 ]
then
[ $result -ge 10 -a $result -le 15 ] && a="优秀"
[ $result -lt 11 ] && a="运动员"
[ $result -ge 30 ] && a="不及格"
case $a in
优秀)
echo "你的成绩为$result s,优秀"
break
;;
运动员)
echo "你的成绩为$result s,运动员"
break
;;
不及格)
echo "你的成绩为$result s,不及格"
break
;;
*)
echo "是个意外,啦啦啦"
break
esac
else
 read -p "你输入的性别有误,请重新输入性别(女生输入:1,男生输入:2)" choose
 gender=$choose
fi
done
~                                           

result -le 15 ] && a=“优秀”
[ $result -lt 11 ] && a=“运动员”
[ $result -ge 30 ] && a=“不及格”
case a i n 优 秀 ) e c h o " 你 的 成 绩 为 a in 优秀) echo "你的成绩为 ain优秀)echo"你的成绩为result s,优秀"
break
;;
运动员)
echo “你的成绩为 r e s u l t s , 运 动 员 " b r e a k ; ; 不 及 格 ) e c h o " 你 的 成 绩 为 result s,运动员" break ;; 不及格) echo "你的成绩为 results,运动员"break;;不及格)echo"你的成绩为result s,不及格”
break
;;
*)
echo “是个意外,啦啦啦”
break
esac
else
read -p “你输入的性别有误,请重新输入性别(女生输入:1,男生输入:2)” choose
gender=$choose
fi
done
~





















转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998207.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号