流程控制之条件判断

目录

流程控制之条件判断

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
相关推荐
长弓聊编程几秒前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
dr李四维6 分钟前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
cherub.8 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
机器学习之心10 分钟前
一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
算法·lstm·transformer·北方苍鹰算法优化·多变量回归预测·ngo-transformer
yyt_cdeyyds20 分钟前
FIFO和LRU算法实现操作系统中主存管理
算法
雯0609~27 分钟前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ30 分钟前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
梅见十柒31 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热34 分钟前
路由基础(全)
linux·网络·网络协议·安全
学习前端的小z36 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript