加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

为什么要用流程控制

发布时间:2023-06-08 14:00:57 所属栏目:教程 来源:
导读:Shell 脚本默认从上到下顺序执行,在程序运行中,会遇到很多种情况,对应不同情况执行对应的操作,例如对于一批数据需要进行执行重复工作,这些都需要我们使用特定的流程控制语句来实现,我们想要程序完成预定的操作
Shell 脚本默认从上到下顺序执行,在程序运行中,会遇到很多种情况,对应不同情况执行对应的操作,例如对于一批数据需要进行执行重复工作,这些都需要我们使用特定的流程控制语句来实现,我们想要程序完成预定的操作,就需要熟练掌握流程控制语句,不同的流程控制语句有不同的适应场景。

为什么要用流程控制

流程控制是每种编程语言控制逻辑走向和执行次序的重要组成部分,流程控制可以说是一门语言的 “经脉”,其控制着程序的运行走向,所以熟练掌握流程控制语句才能更好的控制整个脚本的运行结果,来完成我们的需求。

1. Shell 流程控制操作

1.1 条件语句
顾名思义,就是满足特定条件执行对应操作,按照顺序从上到下,条件语句 if 通常需要与 test 命令配合使用,当满足条件则执行 then 后的 command,否则继续往下运行执行对应的 command,条件语句 if 是 Shell 编程中最基础的条件判断流程语句。

1.1.1 单分支 if 语句
顾名思义就是只有一个 if 语句块包含的语句,condition 为正确则执行 then 内的命令,语法:

if conditionthencommand1 
    command2...
    commandN 
fi
对于 sshd 进程是否存在,可以使用单分支 if 语句来判断,例如:

if [ $(ps -ef |grep /usr/sbin/sshd|grep -v grep|wc -l) -eq 1 ];then 
    echo sshd server existfi
    
1.1.2 双分支 if 语句
多分支 if 语句存在 else 情况,语法:

if conditionthencommand1 
    command2...
    commandNelsecommandfi
统一判断 sshd 服务,可以在 else 中进行一些列操作,例如:

if [ $(ps -ef |grep /usr/sbin/sshd|grep -v grep|wc -l) -eq 1 ];then 
    echo sshd server existelseservice sshd start && echo 启动sshd服务fi
    
1.1.3 多分支 if 语句
顾名思义有多个 if 条件,在此利用 elif 来表示,注意最后有一个 else 结尾。

if condition1;thencommand1elif condition2;then 
    command2......elif conditionN,then
        commandNelsecommandfi
我们的 linux 系统有多个版本,可以利用多分支 if 语句来进行判断,例如:

#! /bin/bashsys_version=$(rpm -q centos-release|cut -d- -f3)if [ $sys_version -eq 6 ];thenecho sysversion is $sys_versionelif [ $sys_version -eq 7 ];thenecho sysversion is $sys_versionelseecho sysversion is ${sys_version}fi

1.2 循环语句
对于一批数据,我们需要对其重复进行操作的时候,就需要利用循环语句来操作。

1.2.1 for 循环
for 循环语句通常应用在可预估数量的一批对象操作中,默认 for 循环的取值列表是以 $IFS 分割,默认 $IFS 为空白符,如果我们有其他需求可以更改,语法为:

for var in item1 item2 ... itemNdocommand1
    command2...
    commandNdone
通过 for 循环每次遍历一个后面跟的对象,在 do…done 操作块中对对象进行一些列操作。

例如我们来求和 1-10 的和:

SUM=0for num in $(seq 1 10)dolet SUM=${SUM}+${num}doneecho 1-10的和为:${SUM}
当然在 for 循环语句里面也可以配合 if 条件判断或其他流程控制语句进行操作。

在此我们举例修改 $IFS 的应用场景,首选备份默认当前的 $IFS,之后为其赋值新的 $IFS 为:,在对 /etc/passwd 进行操作完成后,恢复之前的 $IFS, 在此我们就利用改变 $IFS 对 /etc/passwd 的单个字段进行了变量操作。

#!/bin/bashOLD_IFS=$IFSIFS=:for i in $(head -1 /etc/passwd); doecho $idoneIFS=${OLD_IFS}[root@xuel-terraform-cvm-0 ~]# bash 1.shroot
x
0
0
root
/root
/bin/bash[root@xuel-terraform-cvm-0 ~]# cat /etc/passwd |head -1root:x:0:0:root:/root:/bin/bash
for 循环如果条件永远满足则,一直执行内部的命令。

for (( ; ; ))

1.2.2 while 循环
while 循环同样为循环,与 for 循环功能一样,利用 for 循环的语句同样也可以使用 while 循环完成,但是 while 循环通常用于处理未知数量对象的操作,语法:

while 条件表达式:docommanddone
while 通常与 test 语句配合使用,如果条件表达式成立,则一直执行。

例如求和打印 1-5 个数:

#!/bin/bashN=0while [ $N -lt 5 ]; do
  let N++  echo $Ndone
也可以利用 read 读入文件,例如我们来读入一个写有 ip 或域名列表的文件,来判断该文件内的域名或 IP 网络是否可达。

#!/bin/bash#function:check urlfilename=urllist.txtfor url in $(cat $filename)do
  status=`curl -I --connect-timeout 5 $url -s|awk '/HTTP/{print $2}'`  if [[ $status == 200 ]];then  echo Url:$url is ok!   status is $status
  else  echo Url:$url is error! status is $status
  fidone
编写 urllist.txt。

[root@xuel-terraform-cvm ~]# cat urllist.txtbaidu.com.[root@xuel-terraform-cvm ~]# bash urlcheck.shUrl:baidu.com is ok!   status is Url:. is error! status is
如果 while 的判断条件为永远为 true,则称为无限循环,会一直执行内部的操作,例如:

while :docommanddone或者while truedocommanddone

1.2.3 until 循环
until 循环与 while 循环刚好相反,其也有一定的应用场景,其为条件表达式为 true 时停止,否则一直运行,语法:

until 条件表达式docommanddone
例如我们使用 until 来打印 1-5 数字:

NUM=0until [ ${NUM} -ge 5 ]do 
    let NUM++    echo $NUMdone
    
1.2.4 break 与 continue
与上面三个循环语句不同的是,break 为跳出循环,continue 则为不执行下一次操作,直接跳到下一次循环。

我们可以利用 break 来跳出终止循环。

break

#!/bin/bashN=0while true; dolet N++if [ $N -eq 5 ]; thenbreakfiecho $Ndone
continue

#!/bin/bashN=0while [ $N -lt 5 ]; dolet N++if [ $N -eq 3 ]; thencontinuefiecho $Ndone
利用 continue 来跳过特定的条件操作。

1.3 选择语句
1.3.1 case 语句
选择语句 case 可以在特定的几个条件中选择某一个进行执行,其他 case 可以利用 if 多分支来替代。

case 模式名    in模式 1)命令;;模式 2)命令;;*)不符合以上模式执行的命令
esac
例如我们服务的启动操作脚本就是利用 case 语句来,当用户的输入与模式名相匹配则执行对应的命令。

#!/bin/bashcase $1 instart)echo start.   ;;stop)echo stop.;;restart)echo restart.;;*)echo Usage: $0 {start|s

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章