Shell流程控制
一、if 收款定制开发条件判断语句
- 收款定制开发单分支条件语句判断是 if 收款定制开发中最基本的,收款定制开发判断某个条件成功,返回结果;收款定制开发如果不符合条件则执行另个程序。
1、单分支if语句
- 条件成立,执行程序;如不成立,收款定制开发不进行操作。
收款定制开发单分支流程判断图:
收款定制开发语句示例与案例:
if [ 收款定制开发条件判断式 ] # 判断1,如果成立then 收款定制开发条件成立执行”命令程序“ # 执行这个 “命令程序” fi # 没有成立,直接退出
- 1
- 2
- 3
- 4
磁盘邮件告警案例
#!/bin/bash#---------xy!---------DISK=$(df -h | grep "/dev/mapper/centos-root" | awk '{print $5}' | cut -d"%" -f 1) #摘取磁盘百分比if [ ${DISK} -ge 2 ]thenecho "\"/\" 目录磁盘超过2%" #公司中可改为邮件,使用率自定义fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2、双分支if语句
- 条件成立,执行第一个命令程序,不成立则执行第二个命令程序。
双分支流程判断图:
语句示例与案例:
if [ 条件判断式 ] #条件判断,如果成立then 条件成立执行”命令程序1“ #执行程序1else 条件不成立执行”命令程序2“ #执行程序2fi
- 1
- 2
- 3
- 4
- 5
- 6
检查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所有tcpif [ "${CHECK}" == "LISTEN" ] #判断LISTENthen echo "$(date) 正在运行!" >> /root/acc.log #执行正在运行语句,追加到acc.logelse systemctl start httpd >> /root/err.log #启动httpd,追加到err.logecho "$(date) 正在启动!" >> /root/err.log #输出信息,追加到err.logfi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
文件或目录检查案例
#!/bin/bash#---------xy!---------read -p "请输入文件名:" FILE #输入的信息if [ -z "$FILE" ] #判断是否为空then echo "您未输入任何字符串,文件或目录等" exit 1 #可以用echo $?进行判断elif [ -d "$FILE" ] #判断是否为目录 then echo "这是一个目录" exit 2elif [ -f "$FILE" ] #判断是否为文件 then echo "这是个文件" exit 3else echo “$FILE 是其他字符串,特殊字符等” #否则输出其他 exit 4fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
二、case 多分支条件语句
- case语句和 if…elif…else 语句一样都是多分支条件语句,但是他们俩区别在于:case语句只能判断其中一个并执行对应操作,而if可以判断多总条件关系。
case 多分支流程判断图:
语句示例与案例:
case $变量值 in"变量1") 命令序列1 ;;"变量2") 命令序列2 ;;#...省略更多,,,* ) 都不是执行此命令 ;;esac
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
Apache服务启动脚本案例
#!/bin/bash#---------xy!---------case $1 instart)systemctl $1 httpdecho "$(date) Apache服务已启用!";;stop)systemctl $1 httpdecho "$(date) Apache服务已停止!";;status)#systemctl $CASE httpdCHECK=$(nmap -sT 192.168.10.1 | grep "http" | grep "80/tcp" | awk '{print $2}') #判断httpd状态,直接摘取状态对比if [ "${CHECK}" == "open" ]thenecho "$(date) Apache服务正在运行!" elseecho "$(date) Apache服务未启用!"fi;;restart)systemctl $1 httpdecho "$(date) Apache服务已重启!";;*)echo "只能使用,start,stop,restart,status参数"esac
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
三、for 循环语句
- for 循环用来固定多次循环不同的值,也把 for 循环称为计数循环
for 循环流程图:
语句示例与案例:
for 循环语法1
for 变量 in 值1、2、3、4....do 执行程序done
- 1
- 2
- 3
- 4
for 循环语法2
for (( 初始值;循环控制条件;变量变化))do 执行程序done
- 1
- 2
- 3
- 4
注:
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
#!/bin/bash#---------xy!---------for m in `cat name.txt`douseradd $m &>>/dev/nullecho "123123" | passwd --stdin $m &>>/dev/nulldone
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
1 到 100 的和
#!/bin/bash#---------xy!---------s=0for (( i=1;i<=100;i=i+1 )) #i自增但不超过100do s=$(( $s+$i )) doneecho "1+2+3+4+...+100=$s" #输出和
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
批量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 }&donewait #等待前面内存执行完毕,在执行以下内容echo "检测完毕,成功地址在up-ip.txt中"echo "失败地址在down-ip.txt中"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
四、while和until的区别
1、withe 循环语句
- while循环判断条件式成立,循环会一直继续,直至循环不成立,循环终止。
while 循环流程图:
语句示例与案例:
while [ 条件判断式 ] do 执行程序done
- 1
- 2
- 3
- 4
批量创建用户案例
#!/bin/bash#---------xy!---------NAME="zhangsan" #名称XY=1while [ $XY -le 20 ] #创建个数douseradd ${NAME}$XY &>> /dev/nullecho "123123" | passwd --stdin ${NAME}$XY &>> /dev/nulllet XY++done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
1到100的合
#!/bin/bash#---------xy!---------i=1s=0while [ $i -le 100 ] #while循环小于等于100do s=$(( $s+$i )) i=$(( $i+1 ))doneecho "$s"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2、until 循环语句
- until 循环,和 while 循环恰好相反,until 循环时只要判断不成立就进行循环,一旦条件成立,则终止循环。
until [ 条件判断式 ] do 执行程序done
- 1
- 2
- 3
- 4
until 对于 while区别
#!/bin/bash#---------xy!---------i=1s=0until [ $i -gt 100 ] #until大于100停止循环do s=$(( $s+$i )) i=$(( $i+1 ))doneecho "$s"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
五、特殊流程控制语句
exit 语句
- 系统的命令也有 exit 的,用于退出登录当前用户的状态。在shell中可以用 $? 来退出当前脚本,并用来判断退出的程序。
exit 返回值
- 1
exit 应用案例
#!/bin/bash#---------xy!---------for i in {1,2,3}do echo "192.168.10.$i"doneexit3 #输出指定返回值,默认成功为0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11