目录
流程控制之条件判断
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 条件表达式2then
指令序列2
else
指令序列n
fi等价于:
if 条件表达式1;then
分支1
else
if 条件表达式2then
分支
else
if 条件表达式nthen
分支
else
分支
fi
fi
fi
等价于:
if 条件表达式1;then
if 条件表达式2then
if 条件表达式nthen
else
if
else
if
else
if
2.2.案例
例一:
编写脚本choice1.sh,利用单分支结构实现输入2个整数,判断最大值后输出
read -p "输入整数x:" x read -p "输入整数y:" y max=$x if [ $max -le $y ] thenmax=$yfi 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
编写脚本:sun=$(free -m | tr -s " " | grep Mem | cut -d " " -f4)if [[ $sun < 100 ]] thenecho "警告:内存容量低于100M" elseecho "剩余内存为$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
account=$(id -u)if [ $account -eq 0 ] thenecho "当前脚本执行者身份为root" elseecho "当前脚本执行者不是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命令来判断
account=$( echo $USER )if [[ $account == "root" ]] thenecho "当前脚本执行者身份为root" elseecho "当前脚本执行者不是root,立刻退出脚本执行"fi
使用su - root 重建立当前系统的环境变量后执行以下操作
[root@server ~]# bash /choice3.sh
当前脚本执行者不是root,立刻退出脚本执行
例4:
编写脚本choice4.sh,实现闺年的判断
口诀:闰年:能被4整除但不能被100整除 或者 能被400整除的年份
read -p "请输入四位数年份:" year if [ $(($year%4)) -eq 0 ] && (( $(($year%400)) != 0 )) || [ $(($year%400)) -eq 0 ] thenecho "$year年是闰年" elseecho "$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.sread -p "输入运行的软件名:" name num=$(ps -ef |grep $name | grep -v grep |wc -l) if [ $num -gt 0 ];thenecho "程序$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
read -p "请输入百分制成绩:" scoreif [ -z $score ];thenecho "未输入数字,请重新输入!" elif [ $score -gt 100 ];thenecho "请输入百分制成绩!" elif [ $score -ge 90 -a $score -le 100 ];thenecho "A" elif [ $score -ge 80 ];thenecho "B" elif [ $score -ge 70 ];thenecho "C" elif [ $score -ge 60 ];thenecho "D" elif [ $score -gt 0 ];thenecho "E" elif [ $score -eq 0 ];thenecho "宝宝真棒!!!!!" else [ $score -lt 0 ];thenecho "请输入百分制成绩!!!" 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
请输入百分制成绩:
未输入数字,请重新输入!方法二:
read -p "请输入百分制成绩:" scoreif [ -z $score ];thenecho "为输入数字,请重新输入!" elif [ $score -lt 0 -o $score -gt 100 ];thenecho "成绩有误,重新输入成绩!" elif [ $score -ge 90 -a $score -le 100 ];thenecho "A" elif [ $score -ge 80 ];thenecho "B" elif [ $score -ge 70 ];thenecho "C" elif [ $score -ge 60 ];thenecho "D" elif [ $score -gt 0 ];thenecho "E" else [ $score -eq 0 ];thenecho "宝宝真棒!!!!!" 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
vendor=$(grep "vendor_id" /proc/cpuinfo | uniq |cut -d " " -f2)if [ $vendor == GenuineIntel ];thenecho "Inter" elif [ $vendor == GenuineAMD ];thenecho "AMD" elseecho "nukonw" fi
[root@server ~]# bash choice7.sh
Inter
例8:
编写脚本choice8.sh,检测主机是否存活
一般通过ping来实现测试的。开启另一台虚拟设备Node1
[root@server a1]# vim choice8.sh
read -p "请输入你需要测试的主机地址:" IP ping -c 2 -w 3 $IP &> /dev/nullif [ $? -eq 0 ];thenecho "主机$IP已经运行" elseecho "主机$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没有正常运行# 上例修改,使用循环测试多台主机,存活的主机显示应用高亮的颜色显示
for IP in 192.168.17.{128..135} do #read -p "请输入你需要测试的主机地址:" IPping -c 2 -w 3 $IP &> /dev/nullif [ $? -eq 0 ];thenecho -e "\e[1;31m 主机$IP已经运行\e[0m"elseecho "主机$IP没有正常运行"fi done
测试结果:
例9:
编写脚本choice9.sh,根据用户的输入内容,判断是数字、字母、其它字符
[root@server a1]# vim choice9.sh
read -p "请输入字母、数字或其他字符:" strif echo $str | grep [a-zA-Z] &> /dev/null;thenecho "输入字符为字母!" elif echo $str | grep [0-9] &> /dev/null;thenecho "输入字符为数字!!" elseecho "输入结果为其他字符!!!" 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
read -p "请输入百分制成绩:" scorecase $score in9[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