流程控制之条件判断

目录

流程控制之条件判断

2.1.if语句语法

2.1.1单分支结构

2.1.2双分支结构

2.1.3多分支结构

2.2.案例

例一:

例2:

例3:

例4:

例5:

例6:

例7:

例8:

例9:

2.3.case多条件判断

2.3.1.格式

2.3.2.执行过程

例10:


流程控制之条件判断

2.1.if语句语法

2.1.1单分支结构

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

#语法2:
if <条件表达式>;then
指令
fi # if,if 标志循环起始终止

2.1.2双分支结构

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

2.1.3多分支结构

if 条件表达式

then
指令序列1
elif 条件表达式2

then
指令序列2
else
指令序列n
fi

等价于:

if 条件表达式1;then

分支1

else

if 条件表达式2then

分支

else

if 条件表达式nthen

分支

else

分支

fi

fi

fi

等价于:

if 条件表达式1;then

if 条件表达式2 then

if 条件表达式nthen

else

if

else

if

else

if

2.2.案例

例一:

编写脚本choice1.sh,利用单分支结构实现输入2个整数,判断最大值后输出

bash 复制代码
read -p "输入整数x:" x
read -p "输入整数y:" y
max=$x            
if [ $max -le $y ] 
then
        max=$y

fi
echo "最大值为$max"

注意:此时只能解决较为简单的数值比较,无法判断输入参数类型。若预实现判断类型,请查看上一篇博客

例2:

面试题: 编写脚本choice2.sh,判断当前系统的剩余内存大小,若低于100M则发送消息进
行告警

查看内存容量:[root@server ~]# free -m 注意:-h显示内容带参数

提取内存剩余容量参数:

[root@server ~]# free -m |tr -s " " | grep Mem

Mem: 1935 1249 66 21 805 686
[root@server ~]# free -m |tr -s " " | grep Mem |cut -d " " -f4

66
编写脚本:

bash 复制代码
sun=$(free -m | tr -s " " | grep Mem | cut -d " " -f4)

if [[ $sun < 100 ]]
then
        echo "警告:内存容量低于100M"
else
        echo "剩余内存为$sun M,空间足够"
fi

例3:

编写脚本choice3.sh,判断当前脚本的执行者身份,若不是root账户执行则输出提示,并提示立刻退出脚本执行

查看当前账户身份:(四种方法)

[root@server ~]# vim choice2.sh
[root@server ~]# whoami

root
[root@server ~]# id -u # 只有管理员账户uid为0

0
[root@server ~]# echo $UID

0

[root@server ~]# echo $USER

root # 扩展:su - root 重建立当前系统的环境变量

方法一:利用uid来判断

[root@server ~]# vim choice3.sh

bash 复制代码
account=$(id -u)

if [ $account -eq 0 ]
then
        echo "当前脚本执行者身份为root"
else
        echo "当前脚本执行者不是root,立刻退出脚本执行"

fi

[root@server ~]# bash choice3.sh

当前脚本执行者身份为root
[root@server ~]# mv choice3.sh / # 若要所有账号都可执行该文件则,将文件移动到根下
[root@server ~]# ls /

afs boot dev home lib64 mnt proc run srv tmp var

bin choice3.sh etc lib media opt root sbin sys usr

[root@server ~]# su fox
[fox@server root]$ bash /choice3.sh

当前脚本执行者不是root,立刻退出脚本执行

[fox@server root]$ su root

密码:
[root@server ~]# bash /choice3.sh

当前脚本执行者身份为root

方法二:使用$USER命令来判断

bash 复制代码
account=$( echo $USER )

if [[ $account == "root" ]]
then
        echo "当前脚本执行者身份为root"
else
        echo "当前脚本执行者不是root,立刻退出脚本执行"

fi

使用su - root 重建立当前系统的环境变量后执行以下操作

[root@server ~]# bash /choice3.sh

当前脚本执行者不是root,立刻退出脚本执行

例4:

编写脚本choice4.sh,实现闺年的判断

口诀:闰年:能被4整除但不能被100整除 或者 能被400整除的年份

bash 复制代码
read -p "请输入四位数年份:" year
if [ $(($year%4)) -eq 0 ] && (( $(($year%400)) != 0 )) || [ $(($year%400)) -eq  0 ]
then
        echo "$year年是闰年"
else
        echo "$year年是平年"
fi

[root@server ~]# bash choice4.sh

请输入四位数年份:55

55年是平年
[root@server ~]# bash choice4.sh

请输入四位数年份**:4**

4年是闰年
[root@server ~]# bash choice4.sh

请输入四位数年份:444

444年是闰年

例5:

编写脚本choice5.sh,判断sshd是否运行

[root@server ~]# vim choice5.s

bash 复制代码
read -p "输入运行的软件名:" name
num=$(ps -ef |grep $name | grep -v grep |wc -l)
if [ $num  -gt 0 ];then
        echo "程序$name正在运行!"
fi

[root@server ~]# bash choice5.sh

输入运行的软件名:sshd

程序sshd正在运行!

解析:

通过进程查看sshd是否运行

[root@server ~]# ps -ef |grep sshd | grep -v grep

# 含义:查看并过滤sshd进程,查看并反向过滤grep(不包含grep)

root 33911 32991 0 19:27 pts/2 00:00:00 grep --color=auto sshd

# 该进程为命令本身所对应的进程

[root@server ~]# ps -ef |grep sshd | grep -v grep |wc -l

7 # 过滤行数

通过端口查看sshd是否运行

[root@server ~]# netstat -lntup | grep 22

[root@server ~]# netstat -lntup | grep 22 |wc -l

2

总结:

[root@server ~]# ps -ef |grep 服务名称 | grep -v grep

[root@server ~]# netstat -lntup | grep 端口号

查看某程序是否运行

例6:

编写脚本choice6.sh ,输入百分制成绩,判断后输出等级成绩

方法一:

[root@server ~]# vim choice6.sh

bash 复制代码
read -p "请输入百分制成绩:" score

if [ -z $score ];then
        echo "未输入数字,请重新输入!"
elif [ $score -gt 100 ];then
        echo "请输入百分制成绩!"
elif [ $score -ge 90 -a $score -le 100 ];then
        echo "A"
elif [ $score -ge 80 ];then
        echo "B"
elif [ $score -ge 70 ];then
        echo "C"
elif [ $score -ge 60 ];then
        echo "D"
elif [ $score -gt 0 ];then
        echo "E"
elif [ $score -eq 0 ];then
        echo "宝宝真棒!!!!!"
else [ $score -lt 0 ];then
        echo "请输入百分制成绩!!!"
fi

[root@server ~]# bash choice6.sh

请输入百分制成绩:120

请输入百分制成绩!
[root@server ~]# bash choice6.sh

请输入百分制成绩:100

A
[root@server ~]# bash choice6.sh

请输入百分制成绩:60

D
[root@server ~]# bash choice6.sh

请输入百分制成绩:34

E
[root@server ~]# bash choice6.sh

请输入百分制成绩:0

宝宝真棒!!!!!
[root@server ~]# bash choice6.sh

请输入百分制成绩:-1

请输入百分制成绩!!!!
[root@server ~]# bash choice6.sh

请输入百分制成绩:

未输入数字,请重新输入!

方法二:

bash 复制代码
read -p "请输入百分制成绩:" score

if [ -z $score ];then
        echo "为输入数字,请重新输入!"
elif [ $score -lt 0 -o $score -gt 100 ];then
        echo "成绩有误,重新输入成绩!"
elif [ $score -ge 90 -a $score -le 100 ];then
        echo "A"
elif [ $score -ge 80 ];then
        echo "B"
elif [ $score -ge 70 ];then
        echo "C"
elif [ $score -ge 60 ];then
        echo "D"
elif [ $score -gt 0 ];then
        echo "E"
else [ $score -eq 0 ];then
        echo "宝宝真棒!!!!!"
fi

请输入百分制成绩:123

成绩有误,重新输入成绩!
[root@server ~]# bash choice66.sh

请输入百分制成绩:-1

成绩有误,重新输入成绩!

例7:

编写脚本choice7.sh,判断主机的cpu品牌

计算机CPU信息储存位置:

[root@server ~]# cat /proc/cpuinfo # vendor_id cpu品牌对应字段

[root@server ~]# grep "vendor_id" /proc/cpuinfo |uniq |cut -d " " -f2

GenuineIntel # 截取CUP信息

[root@server ~]# vim choice7.sh

bash 复制代码
vendor=$(grep "vendor_id" /proc/cpuinfo | uniq |cut -d " " -f2)

if [ $vendor == GenuineIntel ];then
        echo "Inter"
elif [ $vendor == GenuineAMD ];then
        echo "AMD"
else
        echo "nukonw"
fi

[root@server ~]# bash choice7.sh

Inter

例8:

编写脚本choice8.sh,检测主机是否存活

一般通过ping来实现测试的。开启另一台虚拟设备Node1

[root@server a1]# vim choice8.sh

bash 复制代码
read -p "请输入你需要测试的主机地址:" IP
ping -c 2 -w 3 $IP  &> /dev/null

if [ $? -eq 0 ];then
        echo "主机$IP已经运行"
else
        echo "主机$IP没有正常运行"

fi

[root@server a1]# bash choice8.sh

请输入你需要测试的主机地址:192.168.17.129

主机192.168.17.129已经运行

[root@server a1]# bash choice8.sh

请输入你需要测试的主机地址:192.168.17.130

主机192.168.17.130没有正常运行

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

bash 复制代码
for IP in 192.168.17.{128..135}
do
#read -p "请输入你需要测试的主机地址:" IP
        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 a1]# vim choice9.sh

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

[root@server a1]# bash choice9.sh

请输入字母、数字或其他字符:123456

输入字符为数字!!
[root@server a1]# bash choice9.sh

请输入字母、数字或其他字符:asdffg

输入字符为字母!
[root@server a1]# bash choice9.sh

请输入字母、数字或其他字符:[]\

输入结果为其他字符!!!

2.3.case多条件判断

2.3.1.格式

case 变量名 in
值1) # 入口数据
指令1

;;
值2) # 入口数据
指令2

;;
值3) # 入口数据
指令3

;;

*)
默认
esac

注意:# 将变量名拿到值1、值2、值3中做等于比较,case做不了除等于以外的比较。

等于哪一个值,就执行对应的指令。;;表示结束 。

若都没有匹配上,则会自动匹配*),并执行对应的默认命令

2.3.2.执行过程

case语句会将该变量的值与 括号中的值相比较,如果与某个值相等,则执行对应语句。

当遇到";;"符号时,就跳出case语句,执行esac语句后面的语句。
如果没有与任何一个值相匹配,则执行*)后面的一组语句

例10:

编写脚本choice10.sh,对上例6的百分制成绩判断等级成绩进行改写

[root@server a1]# vim choice10.sh

bash 复制代码
read -p "请输入百分制成绩:" score

case $score in
        9[0-9]|100)
        echo "等级A"
        ;;
        8[0-9])
        echo "等级B"
        ;;
        6[0-9]|7[0-9])
        echo "等级C"
        ;;
        [0-9]|[1-5][0-9])
        echo "等级D"
        ;;
        *)
        echo "请输入百分制成绩!!谢谢!"
esac
相关推荐
cwj&xyp24 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
LKAI.24 分钟前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
dlnu201525062226 分钟前
ssr实现方案
前端·javascript·ssr
古木201930 分钟前
前端面试宝典
前端·面试·职场和发展
gywl2 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
轻口味2 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王3 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发3 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀3 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js