Shell流程控制
一、if 条件判断语句
- 单分支条件语句判断是 if 中最基本的,判断某个条件成功,返回结果;如果不符合条件则执行另个程序。
1、单分支if语句
- 条件成立,执行程序;如不成立,不进行操作。
单分支流程判断图:
语句示例与案例:
if [ 条件判断式 ] # 判断1,如果成立
then
条件成立执行”命令程序“ # 执行这个 “命令程序”
fi # 没有成立,直接退出
磁盘邮件告警案例
#!/bin/bash
#---------xy!---------
DISK=$(df -h | grep "/dev/mapper/centos-root" | awk '{print $5}' | cut -d"%" -f 1) #摘取磁盘百分比
if [ ${DISK} -ge 2 ]
then
echo "\"/\" 目录磁盘超过2%" #公司中可改为邮件,使用率自定义
fi
2、双分支if语句
- 条件成立,执行第一个命令程序,不成立则执行第二个命令程序。
双分支流程判断图:
语句示例与案例:
if [ 条件判断式 ] #条件判断,如果成立
then
条件成立执行”命令程序1“ #执行程序1
else
条件不成立执行”命令程序2“ #执行程序2
fi
检查Apache状态案例
#!/bin/bash
#---------xy!---------
CHECK=$(netstat -anpt | grep "httpd" | grep "80" | awk '{print $6}') #检查http的端口是否是LISTEN
#CHECK=$(nmap -sT 192.168.10.1 | grep "http" | grep "80/tcp" | awk '{print $2}') #-s扫描 -T所有tcp
if [ "${CHECK}" == "LISTEN" ] #判断LISTEN
then
echo "$(date) 正在运行!" >> /root/acc.log #执行正在运行语句,追加到acc.log
else
systemctl start httpd >> /root/err.log #启动httpd,追加到err.log
echo "$(date) 正在启动!" >> /root/err.log #输出信息,追加到err.log
fi
3、多分支if语句
- 判断测试结果的成立n,执行程序n;n为变量,进行多次判断
多分支流程判断图:
语句示例与案例:
if [ 条件判断式1 ]
then
条件1成立执行”命令程序1“
elif [ 条件判断式2 ]
then
条件2成立执行”命令程序2“
elif [ 条件判断式3 ]
then
条件3成立执行”命令程序3“
elif [ 条件判断式n ]
then
条件n成立执行”命令程序n“
#...省略更多,,,
else
条件判断式都不成立,最后执行此命令程序
fi
文件或目录检查案例
#!/bin/bash
#---------xy!---------
read -p "请输入文件名:" FILE #输入的信息
if [ -z "$FILE" ] #判断是否为空
then
echo "您未输入任何字符串,文件或目录等"
exit 1 #可以用echo $?进行判断
elif [ -d "$FILE" ] #判断是否为目录
then
echo "这是一个目录"
exit 2
elif [ -f "$FILE" ] #判断是否为文件
then
echo "这是个文件"
exit 3
else
echo “$FILE 是其他字符串,特殊字符等” #否则输出其他
exit 4
fi
二、case 多分支条件语句
- case语句和 if…elif…else 语句一样都是多分支条件语句,但是他们俩区别在于:case语句只能判断其中一个并执行对应操作,而if可以判断多总条件关系。
case 多分支流程判断图:
语句示例与案例:
case $变量值 in
"变量1")
命令序列1
;;
"变量2")
命令序列2
;;
#...省略更多,,,
* )
都不是执行此命令
;;
esac
Apache服务启动脚本案例
#!/bin/bash
#---------xy!---------
case $1 in
start)
systemctl $1 httpd
echo "$(date) Apache服务已启用!"
;;
stop)
systemctl $1 httpd
echo "$(date) Apache服务已停止!"
;;
status)
#systemctl $CASE httpd
CHECK=$(nmap -sT 192.168.10.1 | grep "http" | grep "80/tcp" | awk '{print $2}') #判断httpd状态,直接摘取状态对比
if [ "${CHECK}" == "open" ]
then
echo "$(date) Apache服务正在运行!"
else
echo "$(date) Apache服务未启用!"
fi
;;
restart)
systemctl $1 httpd
echo "$(date) Apache服务已重启!"
;;
*)
echo "只能使用,start,stop,restart,status参数"
esac
三、for 循环语句
- for 循环用来固定多次循环不同的值,也把 for 循环称为计数循环
for 循环流程图:
语句示例与案例:
for 循环语法1
for 变量 in 值1、2、3、4....
do
执行程序
done
for 循环语法2
for (( 初始值;循环控制条件;变量变化))
do
执行程序
done
注:
1、初始值:循环开始时,赋予某个变量的初始值,如 i=1 ;
2、循环控制条件:指定循环次数,如 i<=50 ,循环会到此结束;
3、变量变化:每次变量循环的变化,如 i=i+1 ,表示每次 i 的值都加1.
for 循环批量添加用户
[root@localhost ~]# cat << EOF >> name.txt
> zhangsan
> lisi
> wangwu
> xy
> liming
> EOF
#!/bin/bash
#---------xy!---------
for m in `cat name.txt`
do
useradd $m &>>/dev/null
echo "123123" | passwd --stdin $m &>>/dev/null
done
1 到 100 的和
#!/bin/bash
#---------xy!---------
s=0
for (( i=1;i<=100;i=i+1 )) #i自增但不超过100
do
s=$(( $s+$i ))
done
echo "1+2+3+4+...+100=$s" #输出和
批量ping主机案例
#!/bin/bash
#---------xy!---------
#for i in {1..254}
for i in {1,2,3,4,}
do
{ #{}&,将大括号里面的内容放入后台去执行
ip=192.168.10.$i
ping -c3 -i0.2 -W3 $ip &>> /dev/null
if [ $? -eq 0 ]
then
echo "$(date +%Y-%m-%d,%H:%M:%S) $ip is up" >> up-ip.txt
else
echo "$(date +%Y-%m-%d,%H:%M:%S) $ip is down" >> down-ip.txt
fi
}&
done
wait #等待前面内存执行完毕,在执行以下内容
echo "检测完毕,成功地址在up-ip.txt中"
echo "失败地址在down-ip.txt中"
四、while和until的区别
1、withe 循环语句
- while循环判断条件式成立,循环会一直继续,直至循环不成立,循环终止。
while 循环流程图:
语句示例与案例:
while [ 条件判断式 ]
do
执行程序
done
批量创建用户案例
#!/bin/bash
#---------xy!---------
NAME="zhangsan" #名称
XY=1
while [ $XY -le 20 ] #创建个数
do
useradd ${NAME}$XY &>> /dev/null
echo "123123" | passwd --stdin ${NAME}$XY &>> /dev/null
let XY++
done
1到100的合
#!/bin/bash
#---------xy!---------
i=1
s=0
while [ $i -le 100 ] #while循环小于等于100
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "$s"
2、until 循环语句
- until 循环,和 while 循环恰好相反,until 循环时只要判断不成立就进行循环,一旦条件成立,则终止循环。
until [ 条件判断式 ]
do
执行程序
done
until 对于 while区别
#!/bin/bash
#---------xy!---------
i=1
s=0
until [ $i -gt 100 ] #until大于100停止循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "$s"
五、特殊流程控制语句
exit 语句
- 系统的命令也有 exit 的,用于退出登录当前用户的状态。在shell中可以用 $? 来退出当前脚本,并用来判断退出的程序。
exit 返回值
exit 应用案例
#!/bin/bash
#---------xy!---------
for i in {1,2,3}
do
echo "192.168.10.$i"
done
exit3 #输出指定返回值,默认成功为0
break 语句
- break 的作用是:当程序执行到此 break 语句时,会直接结束当前循环。
break 应用案例
#!/bin/bash
#---------xy!---------
for i in {2,3,4,5,6}
do
if [ "$i" -eq 4 ]
then
break #直接退出程序
fi
echo "$i"
done
continue 语句
- continue 语句跟 break 的区别:break 是结束当前循环,以及之后的循环;而 continue 是结束当前循环,继续下次循环。
continue 应用案例
#!/bin/bash
#---------xy!---------
for i in {2,3,4,5,6}
do
if [ "$i" -eq 4 ]
then
continue #跳过此次循环
fi
echo "$i"
done