16、流程控制之条件判断、循环

RHCE板块

欢迎来到我的博客,这里是Linux板块,配合之前RHCSA进阶,希望我的博客可以帮助到您,感谢您的阅读,有什么问题还希望一起探讨交流,感谢各位的支持,感谢!

  1. 使用Linux搭建一个简单的论坛
  2. RHCE——一、安装部署及例行性工作
  3. RHCE——二、时间服务器
  4. RHCE——三、远程连接服务器
  5. RHCE——四、Web服务器(理论篇
  6. RHCE——五、Web服务器及内网穿透(实验篇
  7. RHCE——六、基于https协议的静态网站
  8. RHCE——七、搭建云存储器
  9. RHCE——八、DNS域名解析服务器
  10. RHCE——九、SELinux
  11. RHCE——十、防火墙、iptables、firewalld
  12. RHCE——十一、NFS服务器
  13. RHCE——十二、Mysql服务
  14. RHCE——十三、Shell自动化运维编程基础
  15. RHCE——十四、变量和引用
  16. RHCE——十五、shell条件测试
  17. RHCE——十六、流程控制之条件判断、循环
  18. RHCE——十七、文本搜索工具-grep、正则表达式
  19. RHCE——十八、shell编程之sed
  20. RHCE——十九、shell编程之awk
  21. RHCE——二十、Ansible及安装与配置
  22. RHCE——二十一、Ansible模块

一、if语句语法

1、单分支结构

# 语法1:
if <条件表达式>
then
	指令
fi
#语法2:
if <条件表达式>;then
	指令
fi

2、双分支结构

if <条件表达式>
then
	指令序列1
else
	指令序列2
fi

3、多分支结构

if 条件表达式1
then
	指令序列1
elif 条件表达式2
then
	指令序列2
else
	指令序列n
fi

二、案例

  • 例1:编写脚本choice1.sh,利用单分支结构实现输入2个整数,判断最大值后输出($符相当于取值符号)
[root@server ~]# vim  choice1.sh
#!/bin/bash
read -p "请输入第一个整数: " x
read -p "请输入第二个整数: " y
max=$x
if (($max<$y))
then    
        max=$y
fi      
echo  "最大值:$max"

在这里插入图片描述

  • 例2:面试题:编写脚本choice2.sh,判断当前系统的剩余内存大小,若低于100M则发送消息进行告警
[root@server ~]# vim  choice2.sh
#!/bin/bash
free_mem=$(free -m | grep  Mem | tr -s " " | cut -d " " -f4)
if (($free_mem < 100))
then    
        echo  "警告,剩余内存为:$free_mem , 低于100MB"
else
        echo  "剩余内容为: $free_mem , 空间足够"
fi

在这里插入图片描述

  • 例3:编写脚本choice3.sh ,判断当前脚本的执行者身份,若不是root账户执行则输出提示,并退出
# 检查当前账户4种方法:
[root@server ~]# whoami
[root@server ~]# id  -u
[root@server ~]# echo  - $USER
[root@server ~]# echo  - $UID
[root@server ~]# vim  choice3.sh
#!/bin/bash
if [ "$USER" != "root" ]
then    
        echo  "please switch user root"
fi      
[root@server ~]# mv  choice3.sh  /  # 移动脚本到根
[root@server ~]# su fox       # 切换账户身份
[fox@server root]$ cd  /
[fox@server /]$ bash  choice3.sh 
please switch user root

在这里插入图片描述

  • 例4:编写脚本choice4.sh , 实现闰年的判断
# 闰年:能被4整除但不能被100整除或者能被400整除的年份
[root@server ~]# vim  choice4.sh
#!/bin/bash
read -p "请输入四位数年份: " year
if [ $(($year%4)) -eq 0 ] && [ $(($year%100)) -ne 0 ] || [ $(($year%400)) -eq 0 ]
then
        echo  "$year 年是闰年"
else
        echo  "$year 年是平年"
fi

在这里插入图片描述

  • 例5:编写脚本choice5.sh,判断sshd是否运行
# 分析
# 1.通过分析服务执行的进程数判断
[root@server ~]# ps  -ef | grep  服务名 | grep -v grep | wc -l
# 2.通过查看是否开放端口判断
[root@server ~]# netstat  -lntup | grep 端口号 | wc -l
[root@server ~]# choice5.sh
#!/bin/bash
num=$(ps  -ef | grep  sshd | grep -v grep | wc -l)
if (($num>0))
then
        echo  "sshd is running"
else
        echo  "sshd is not running"
fi

在这里插入图片描述

  • 例6:编写脚本choice6.sh , 输入百分制成绩,判断后输出等级成绩
[root@server ~]# choice6.sh
read -p  "请输入百分制成绩: "  score
if [ -z $score ]
then
        echo  "未输入,请重新输入."
elif  (($score<0 || $score>100 ))
then
        echo  "成绩输入有误,请输入0-100间整数成绩"
elif  (($score >= 90))
then
        echo "成绩优秀"
elif   (($score >=80))
then
        echo  "成绩良好"
elif   (($score>=60))
then
        echo  "成绩及格"
else
        echo  "补考"
fi

在这里插入图片描述

  • 例7:编写脚本choice7.sh,判断主机的cpu品牌
[root@server ~]# choice7.sh
#!/bin/bash
vendor=$(grep  "vendor_id"  /proc/cpuinfo | uniq | cut -d " " -f2)
if [ $vendor == GenuineIntel ]
then
        echo  "Inter"
elif [ $vendor == GenuineAMD ]  # AuthenticAMD
then
        echo  "AMD"
else
        echo  "unknow"
fi

在这里插入图片描述

  • 例8:编写脚本choice8.sh,检测主机是否存活
[root@server ~]# choice8.sh
#!/bin/bash
read -p "请输入测试主机的IP地址:"  ip
ping  -c 2 -w 3 $ip  &> /dev/null
# -c 2 表示发出2个数据包,-w 3表示等待3秒结束,注意:不能等待1秒结束,有可能第二个包未返回就结束会报错
if [ $? -eq 0 ]
then
        echo  "主机$ip已运行"
else
        echo  "主机$ip未运行"
fi

在这里插入图片描述

# 上例修改,使用循环测试多台主机,存活的主机显示应用高亮的颜色显示
#!/bin/bash

for ip  in 192.168.48.{125..135}
do
        ping  -c 2 -w 3 $ip  &> /dev/null
        if [ $? -eq 0 ]
        then
                echo  -e "\e[1;31m主机$ip已运行\e[0m"
        else
                echo  "主机$ip未运行"
        fi
done    
  • 例9:编写脚本choice9.sh,根据用户的输入内容,判断是数字、字母、其它字符
[root@server ~]# vim  choice9.sh
#!/bin/bash
read -p  "请输入字母、数字、其它字符: " str
if echo $str | grep [a-zA-Z]  >  /dev/null
then
        echo  "字母"
elif  echo  $str | grep [0-9]  > /dev/null
then
        echo  "数字"
else
        echo  "字符"
fi

在这里插入图片描述

三、case多条件判断

1、格式

case 变量名 in
	值1)
	 指令1
	;;
	值2)
	 指令2
	;;
	值3)
	 指令3 
	;;
	*)
	默认 
esac

2、执行过程

  • case语句会将该变量的值与 )括号中的值相比较,如果与某个值相等,则执行对应语句。
  • 当遇到“;;”符号时,就跳出case语句,执行esac语句后面的语句。
  • 如果没有与任何一个值相匹配,则执行)后面的一组语句*

3、示例

  • 例10:编写脚本choice10.sh,对上例7的百分制成绩判断等级成绩进行改写
[root@server ~]# vim  choice10.sh
#!/bin/bash
read -p "请输入百分制成绩: " score
case $score in
        9[0-9]|100)
                echo "成绩优秀"
        ;;
        8[0-9])
                echo  "成绩良好"
        ;;
        6[0-9]|7[0-9])
                echo  "成绩及格"
        ;;
        *)
                echo  "补考"
esac

在这里插入图片描述

四、for循环

  • for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。本节将介绍这3种不同的for循环结构。

1、带列表的for循环

  • 格式:
for 循环变量 in {list} 
do
	statement1
	statement2
	...
done
  • 分析

    • variable称为循环变量
    • list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开
    • do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句
    • 执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体,当循环体中的语句执行完毕之后剩余以此类推,当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句
  • 例1:

[root@server ~]# vim  for1.sh
#!/bin/bash

for ip in 192.168.48.130 192.168.48.131
do
        echo $ip
done
[root@server ~]# bash for1.sh 
192.168.48.130
192.168.48.131
[root@server ~]# vim  for2.sh
#!/bin/bash
for ip in 192.168.48.{130..140..2} # 使用{start..end..step} 进行扩展
do
        echo  $ip
done
[root@server ~]# bash for2.sh 
192.168.48.130
192.168.48.132
192.168.48.134
192.168.48.136
192.168.48.138
192.168.48.140
  • 例2:获取指定目录下的所有目录的文件名
#!/bin/bash
for file  in $(ls -F / | grep  /$)
do
        echo  $file | cut  -d  "/" -f1
done
# ls -F  :用于将目录内的文件按照文件类型进行归类显示,会在不同类别的文件名尾部增加不同的标识符,目录以/结尾、链接文件以@结尾、可执行文件以*结尾、普通文件无符号
# grep /$ :表示过滤以/结尾的行
  • shell允许用户指定for语句的步长,格式如下
for variable in {start..end..step}
do
	statement1
	statement2
	...
done
  • 例3:计算1+2+3+4+5+……+100和
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in {1..100..1}
do
        ((sum=sum+i))
done
echo "sum=$sum"
# 上例修改
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in $(seq 100)
do
        ((sum=sum+i))
done
echo "sum=$sum"

2、不带列表的for循环

  • 原则:for不提供循环列表,shell将从命令行获取循环列表数据及条件,格式:
for variable
do
	statement1
	statement2
	...
done
  • 由于系统变量$@可以获取所有位置参数,以上的语法等价于:
for variable in $@$*
do
	statement1
	statement2
	...
done
  • 例4:
[root@server ~]# vim for5.sh
#!/bin/bash
for  arg
do      
        echo  $arg
done    
[root@server ~]# bash for5.sh   {1..10}

3、基于C语言风格的for循环

  • 格式
for ((初始化;条件表达式;步长))    # 注意:2个圆括号
do
	statement1
	statement2
	...
done
  • 例5:面试题,批量创建账户
[root@server ~]# vim  for6.sh
#!/bin/bash
for((i=1;i<=10;i++))
do      
        if  ! id -u temp$i  &> /dev/null
        then    
                useradd  temp$i
                echo  "123456"  | passwd --stdin tmep$i  &> /dev/null
        else    
                echo  "temp$i 账户已存在"
        fi      
done
  • 注意:i++表示置后自增,++i置前自增
[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo  $((x++))
1
[root@server ~]# echo $x
2
[root@server ~]# echo  $((++y))
3
[root@server ~]# echo $y
3

五、while循环

1、格式

while  expression
do
	statement1
	statement1
	……
done
  • 上例语法中,expression表示条件表达式,循环必须满足该表达式,否则循环结束,可以是任何符合语法的shell命令,但推荐书写测试表达式

2、while循环读取文件

# 法1 ,采用exec读取文件
[root@server ~]# vim  file1.txt
data1
data2
data3
data4
data5
[root@server ~]# vim  while1.sh
#!/bin/bash
exec  < file1.txt
while  read   a
do
        echo $a
done
# exec  < file1.txt  将file.txt文件内容读入到标准输入中
# read   a  表示从标准输入中按照行读取内容到变量a
# 法2:使用cat读取文件,通过管道符进入while循环处理
cat  文件名  |  while  read line
do  
	statement1
	statement1
	……
done
#法3 : 在while循环尾部使用输入重定向指定输入数据
while  read  line
do
	statement1
	statement1
	……
done  <  文件名

3、while语句示例

  • 例1:猜商品价格,通过变量RANDOM获取随机整数并控制20以内,提示用户猜测商品价格,猜测时需要记录次数,猜中后退出程序
[root@server ~]# vim  while2.sh
#!/bin/bash
price=$[ $RANDOM%20 ]
count=0
while true
do
        read -p "请输入[0-20]间的商品价格: "  INT
        let count++
        if(($INT==$price))
        then
                echo  "恭喜,你猜中!"
                echo  "你使用了$count次机会"
                exit  0
        elif (($INT>$price))
        then
                echo  "你输入的商品价格高了!"
        else
                echo  "你输入的商品价格低了!"
        fi
done

六、until循环

1、作用

  • until循环不断地重复执行循环中的语句,直至某个条件成立,与while循环的执行条件相反
until  expreession
do
	statement1
	statement2
	……
done

2、示例

# while3.sh 的改写
#!/bin/bash
i=1
until [  $i -gt 10 ]  # i>10 ,注意,条件要相反
do
        if id -u temp$i &> /dev/null
        then
                userdel  -r test$i
        else
                echo "test$i 账户已删除"
        fi
        let i++
done

七、循环控制

1、组成

  • break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中

  • continue: 作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行

2、详细语法:

image-20230203155022121
*image-20230203155121630

image-20230203155139021image-20230203155153424

3、示例

  • 例1:判断素数
[root@server ~]# vim  for7.sh
#!/bin/bash
read  -p  "请输入一个正整数: " prime
if ((prime<2))
then
        echo "数据错误,请输入大于等于2的正整数!"
else    
        for ((i=2;i<prime;i++))
        do      
                if ((prime%i==0))
                then    
                        echo  "平数"
                        break
                fi      
        done   
        if ((i==prime))
        then    
                echo "素数"
        fi      
fi      

在这里插入图片描述

  • 例2:计算100到150之间不能被3整除的数,输出时一行显示5个
[root@server ~]# bash  for8.sh
#!/bin/bash
count=0
for((i=100;i<150;i++))
do
        if ((i%3==0))
        then
                continue
        fi
        echo -ne "$i\t"
        ((count++))
        if ((count%5==0))
        then
                echo
        fi
done
echo

在这里插入图片描述

4、循环嵌套

  • 例1:九九乘法表
[root@server ~]# bash  for9.sh
#!/bin/bash
for i in $(seq 9)
do
        for j in $(seq 9)
        do
                ((j<=i)) &&  echo  -ne "$i*$j=`echo $((i*j))` \t"
        done
        echo
done
  • 例2:打印三角形
[root@server ~]# bash  for10.sh
#!/bin/bash
read  -p  "请输入图形行数:"  h   
for ((i=0;i<h;i++))         # 循环处理h行
do
        for ((j=0;j<h-i;j++))  # 每行打印一些空格
        do
                echo  -n " "
        done
        for ((k=0;k<2*i+1;k++))  # 每行打印一些星号
        do
                echo  -n  "*"
        done
        echo                     # 每行最后打印一个\n
done
  • 例3:打印数字三角形
[root@server ~]# bash  for11.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
        for ((j=1;j<=10-i;j++))
        do
                echo  -n  " "
        done
        for ((k=1;k<=i;k++))
        do
                echo  -n  "$i"
        done
        echo
done

八、作业

1、作业一

判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查次磁盘剩余空间。

  • 第一步、安装邮件服务
[root@server ~]# yum install s-nail -y

在这里插入图片描述

  • 第二步、修改配置文件
[root@server ~]# vim /etc/s-nail.rc

后面加上以下内容:

set  from=17674044@qq.com
set  smtp=smtp.qq.com
set  smtp-auth-user=qq邮箱
set  smtp-auth-password=授权码
set  smtp-auth=login

在这里插入图片描述

这里使用wq!退出,由于为只读文件。
这里授权码不会的看第一章例行性工作查看具体步骤。

  • 第三步、编写脚本
[root@server ~]# vim disk1.sh

在这里插入图片描述

  • 第四步、配置系统化任务(不懂原理同样看第一章例行性工作)
[root@server ~]# vim /etc/crontab

在这里插入图片描述

这里由于为了尽快看到效果,我这里就设置每分钟发送一次:
在这里插入图片描述
效果截图:
在这里插入图片描述
在这里插入图片描述

2、作业二

判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端口的方式判断该程序是否运行),如果没有运行,则启动该服务并配置防火墙规则。

  • 使用进程进行查看:
    直接编写脚本文件即可:
[root@server ~]# vim test.sh

在这里插入图片描述
执行脚本即可:

[root@server ~]# bash test.sh
  • 使用端口号进行判断:
    同样直接编写脚本:
[root@server ~]# vim test1.sh

在这里插入图片描述
执行脚本:

[root@server ~]# bash test1.sh

在这里插入图片描述

3、作业三

使用curl命令访问第二题的web服务,看能否正常访问,如果能正常访问,则返回web serveis running;如果不能正常访问,返回12状态码。

  • 第一步、编写脚本:
[root@server ~]# vim test2.sh

在这里插入图片描述

  • 第二步,执行脚本
[root@server ~]# bash test2.sh

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值