shell中的执行流控制

  • 1 for语句
    • 1.1 作用及语句结构
    • 1.2 for语句的基本格式
  • 2 条件语句
    • 2.1 while...do
    • 2.2 until...do
    • 2.3 if语句
    • 2.4 case语句
  • 3 expect自动应答
  • 4 break,continue,exit
  • 5 脚本练习

1 for语句

shell中的执行流是从上往下依次执行,使用不同的语句可以优化代码,使得代码结构更加清晰同时减少代码运行时间。

1.1 作用及语句结构

  • 作用:为循环执行动作
  • for语句结构:
for      ##定义变量
do      ##使用变量,执行动作
done    ##结束标志

1.2 for语句的基本格式

1)格式1

#!/bin/bash
for WESTOS in `seq 1 10`  ##表示从1到10循环输出
doecho $WESTOS
done#!/bin/bash
for WESTOS in `seq 1 2 10`    ##自定义步长,表示从1开始步长为2直到10
doecho $WESTOS
done

默认步长为1:

自定义步长为2:

2)格式2

for WESTOS in westos linux lee
doecho $WESTOS
done


3)格式3

for WESTOS in {10..1}
doecho $WESTOS
done


注意:for语句的格式1不能逆序输出

4)格式4

for ((USER=1;USER<5;USER++))
doecho $USER
done

2 条件语句

2.1 while…do

  • 作用:条件为真执行动作
  • 语句结构:
while true   ##条件为真
do          ##条件成立所作循环动作
done


2.2 until…do

  • 作用:条件为假执行动作
  • 语法结构:
until false  ##条件为假
do              ##条件不成立所做动作
done


注意:同while一样,unit后面的false可以替换成某个条件

2.3 if语句

  • 作用:多次判定条件执行动作
  • 代码结构:
if            ##首次判定
then         ##条件成立执行动作
elif         ##首次判定不成立时再次判定
then         ##条件成立执行动作
……
else         ##所有条件不成立执行动作
fi           ##结束

2.4 case语句

  • case的功能性较强,它是一个点名机制。 if主要是字符对比,需要从上到下依次执行,效率低(写脚本时,选择最优的方法即可)
  • 语法结构:
case $1 in word|WORD)   ##case后面直接可以这样写,不需要再去转换大小写action1;;word1|WORD1)   action2;;……*)action3      ##前面都不满足时执行
esac

3 expect自动应答

expect可以实现自动的针对系统中提出的一些问题做出应答,节省手动回答问题的时间,举个例子,如下所示:

问题脚本:
#!/bin/bash
read -p "what's your name:" NAME
read -p "How old are you: " AGE
read -p "Which objective: " OBJ
read -p "Are you ok? " OK
echo $NAME is $AGE\'s old study $OBJ feel $OK应答脚本:
#!/usr/bin/expect
set timeout 1       ##回答问题的等待时间为1s,答不出来就跳过
set NAME [ lindex $argv 0 ]  ##执行脚本时后面所跟的第一串字符,下面的依次类推
set AGE [ lindex $argv 1 ]
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh       ##回答哪个脚本里的问题
expect {"name" { send "$NAME\r";exp_continue }##遇到问题中有name时,回答变是量NAME的值,以下同理 ;exp_continue表示回答继续
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"ok" { send "$FEEL\r" }
}
expect eof      ##退出expect交互环境
interact        ##不退出交互环境

1)编写一个问题脚本:

此时运行该脚本时,回答问题需要手动输入:

2)为了解决不能自动回答,且可能发生回答的答案与问题不符的情况,可以编写expect文件。首先需要安装expect软件:

3)编写应答脚本,应答脚本必须以 .exp 结尾,其解释器如下图所示:

这里在第一次调用应答脚本时,由于问题脚本的权限限制,所以无法调用该脚本,此时输入“chmod a+x ask.sh”给该文件加上可执行权限即可;注意exp脚本的调用使用expect命令:

4)上面的回答方式是固定的,一旦问题发生改变,那么应答脚本的回复也会出现错乱。为了解决该问题可以使用传参的方式来保证问题和答案的匹配性:

此时运行该脚本时,需要在后面将参数,也就是问题的答案传进入:

5)以上的方式是问题脚本和回答脚本分别写在两种类型的文件中,如果问题和答案脚本有很多,就容易混乱。所以也可以使用shell脚本写答案:

执行shell脚本时传参进入:

4 break,continue,exit

参数 含义
break 终止当前所在语句所有动作进行语句外的其他动作
continue 终止此次循环提前进入下一次循环
exit 脚本退出

1)程序依次执行到exit时,会直接退出脚本,所以不会输出end,此时默认的退出值是0:

如下表示退出时,设定退出值为33,此时输入echo $? 表示查看退出值,可以看到退出值为33。当再次查看退出值时,看到退出值恢复为默认的0:

如下输入系统无法识别的命令后,查看退出值,退出值为127:

注意:
退出值不同数字的含义:0表示成功;2表示权限拒绝;1~125表示运行失败或脚本命令,系统命令错误或参数传递错误;126表示找到该命令了,但是无法执行;127表示未找到在运行的命令;128表示命令被系统强制结束

2)break会跳出当前循环,跳出后输出end,然后结束:

3)continue会跳出本次循环,然后继续下一次循环,所以在4的时候跳出本次循环,继续进行下次循环:

5 脚本练习

1)编写名为check_host.sh的脚本,用此脚本检测10台与您当前主机直连主机是否网络通畅:

2)使用for语句和if语句写一个10秒倒计时:
注意:bye那条语句起到了覆盖前一条语句结果的作用,所以该语句必须和上一条语句长度相同或更长;echo -n表示不换行;\r表示回车:


当最后倒计时结束后,bye会覆盖前面的语句,最终被显示出来:

3)使用for和if语句写一个1分10秒倒计时:

4)编写一个脚本要求如下,若http服务不存在,则显示不存在;若http服务存在,输入 sh ctrl_service.sh start httpd 后服务:就开启服务;输入 sh ctrl_service.sh stop httpd就关闭:

5)编写一个名为host_list.sh的脚本,检测10-20主机的网络是否开启:

shell中的执行流控制相关推荐

  1. shell脚本中的执行流控制

    执行流就是执行顺序 shell中默认执行顺序是从上到下依次执行 for语句 作用:为循环执行动作 for语句结构 for        定义变量 do        使用变量,执行动作 done    ...

  2. linux shell 执行存储过程,在shell中调用执行存储过程

    基本的shell文件结构如下: sqlplus user/password < exec proc_name; exit ! Demo procedure name: sp_ems_hasten ...

  3. shell中循环执行某个进程获取返回值,并循环执行直到函数出错

    测试进程test的代码 #include <stdio.h>int main(){return 0; } 编译出测试程序: gcc test.c -o test 测试脚本 #!/bin/s ...

  4. shell中计算执行命令所用耗时

    #函数的定义 ;传入秒.纳秒 转换成 <时:分:秒.毫秒> 格式 function fun_use_hours(){if [ $# -ne 2 ];thenecho $@echo &quo ...

  5. Linux从mysql中读取数据_linux shell中读写操作mysql数据库

    本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...

  6. linux shell中./a.sh , sh a.sh , source a.sh, . ./a.sh的区别

    在linux shell中, 执行shell script的方式有多种, 有什么区别呢? 现在用一个简单例子再来说下. a.sh的内容是: #! /bin/bash echo hello world ...

  7. 在shell中改变当前环境路径

    在linux环境下,常有通过shell脚本进入指定目录的操作,例如有一段脚本chdir.sh:     #!/bin/sh   cd /home/user/Downloads   pwd 在shell ...

  8. lua执行shell命令6_Vim执行shell命令及使用Vim批量更改文件名

    写在前面:我"胡汉三"又回来了~上周顺利通过了试用期答辩,现在俺是一名正式的鹅厂人啦.哈哈哈~感谢各位可爱又热心的好伙伴对我的"不离不弃". 话休絮烦,今天分享 ...

  9. shell中执行脚本并显示到终端和保存到日志文件中

    我们知道,在shell中执行脚本会返回一定信息到终端屏幕上 ,但是有一些特殊情况,如以下情况: 1)显示到终端中 echo  "abck" 以上在手动执行脚本中是可以的,如果是编写 ...

最新文章

  1. Python案例:使用XPath的爬虫
  2. pjax php,ZBlogPHP简单实现pjax的一种方法
  3. 同时给两个变量值赋值
  4. 分享一道JS前端闭包面试题
  5. pytorch 笔记:gather 函数
  6. 全文检索引擎Solr系列——Solr核心概念、配置文件
  7. linux中shell如何输出换行符
  8. 多线程——实现Runnable接口实现一个多线程
  9. Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序
  10. dubbo provider异步_Dubbo相关面试题
  11. 数据科学 IPython 笔记本 8.8 直方图,分箱和密度
  12. 又是一个github吗? Kubernetes 初创公司 Heptio被VMware 收购
  13. JS向NPAPI传递参数,并返回结果
  14. 计算机领域CCF推荐会议列表
  15. 电子元器件选型——MOSFET
  16. InVEST实践与进阶及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中的具体应用
  17. 从客户需求开始你的供应链管理战略
  18. 基本的 DBus 偵錯技巧
  19. c语言设计一个语音识别程序,用 C# 开发自己的语音识别程序
  20. 可以使用ActualHeight来判断textblock是否已经trimming

热门文章

  1. 在线作图丨做一张叠加mantel test的相关性热图
  2. 结果方程模型(SEM)的理论和基本实现过程
  3. Science:固氮(The nitrogen fix)
  4. 来者不拒,“昊”课等你——直播微生物篇
  5. Lancet:支持奋战在疫情一线的中国科研技术工作者
  6. 关于新冠肺炎的一切|回形针
  7. 可持续农业生态系统中的核心微生物组
  8. PJ:细菌挥发性物质和光合信号激活低铁响应途径
  9. R语言ggplot2可视化散点图、移除可视化图像中的网格线(remove gridlines)
  10. R语言使用ggplot2包使用geom_density()函数绘制分组密度图(自定义调色板、brewer、灰度比例)实战(density plot)