RHCE——十六、流程控制之条件判断、循环

RHCE

  • 一、if语句语法
    • 1、单分支结构
    • 2、双分支结构
    • 3、多分支结构
  • 二、案例
  • 三、case多条件判断
    • 1、格式
    • 2、执行过程
    • 3、示例
  • 四、for循环
    • 1、带列表的for循环
    • 2、不带列表的for循环
    • 3、基于C语言风格的for循环
  • 五、while循环
    • 1、格式
    • 2、while循环读取文件
    • 3、while语句示例
  • 六、until循环
    • 1、作用
    • 2、示例
  • 七、循环控制
    • 1、组成
    • 2、详细语法:
    • 3、示例
    • 4、循环嵌套
  • 八、作业
    • 1、作业一
    • 2、作业二
    • 3、作业三

一、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"

RHCE——十六、流程控制之条件判断、循环_第1张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第2张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第3张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第4张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第5张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第6张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第7张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第8张图片

# 上例修改,使用循环测试多台主机,存活的主机显示应用高亮的颜色显示
#!/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

RHCE——十六、流程控制之条件判断、循环_第9张图片

三、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

RHCE——十六、流程控制之条件判断、循环_第10张图片

四、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、详细语法:

RHCE——十六、流程控制之条件判断、循环_第11张图片
*RHCE——十六、流程控制之条件判断、循环_第12张图片

RHCE——十六、流程控制之条件判断、循环_第13张图片RHCE——十六、流程控制之条件判断、循环_第14张图片

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      

RHCE——十六、流程控制之条件判断、循环_第15张图片

  • 例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

RHCE——十六、流程控制之条件判断、循环_第16张图片

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

RHCE——十六、流程控制之条件判断、循环_第17张图片

  • 第二步、修改配置文件
[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

RHCE——十六、流程控制之条件判断、循环_第18张图片

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

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

RHCE——十六、流程控制之条件判断、循环_第19张图片

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

RHCE——十六、流程控制之条件判断、循环_第20张图片

这里由于为了尽快看到效果,我这里就设置每分钟发送一次:
RHCE——十六、流程控制之条件判断、循环_第21张图片
效果截图:
RHCE——十六、流程控制之条件判断、循环_第22张图片
RHCE——十六、流程控制之条件判断、循环_第23张图片

2、作业二

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

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

RHCE——十六、流程控制之条件判断、循环_第24张图片
执行脚本即可:

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

RHCE——十六、流程控制之条件判断、循环_第25张图片
执行脚本:

[root@server ~]# bash test1.sh

RHCE——十六、流程控制之条件判断、循环_第26张图片

3、作业三

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

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

RHCE——十六、流程控制之条件判断、循环_第27张图片

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

RHCE——十六、流程控制之条件判断、循环_第28张图片

你可能感兴趣的:(RHCE,Linux,网络,服务器,网络协议,运维,前端,Web安全,网络安全)