shell中的执行流控制
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中的执行流控制相关推荐
- shell脚本中的执行流控制
执行流就是执行顺序 shell中默认执行顺序是从上到下依次执行 for语句 作用:为循环执行动作 for语句结构 for 定义变量 do 使用变量,执行动作 done ...
- linux shell 执行存储过程,在shell中调用执行存储过程
基本的shell文件结构如下: sqlplus user/password < exec proc_name; exit ! Demo procedure name: sp_ems_hasten ...
- shell中循环执行某个进程获取返回值,并循环执行直到函数出错
测试进程test的代码 #include <stdio.h>int main(){return 0; } 编译出测试程序: gcc test.c -o test 测试脚本 #!/bin/s ...
- shell中计算执行命令所用耗时
#函数的定义 ;传入秒.纳秒 转换成 <时:分:秒.毫秒> 格式 function fun_use_hours(){if [ $# -ne 2 ];thenecho $@echo &quo ...
- Linux从mysql中读取数据_linux shell中读写操作mysql数据库
本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...
- linux shell中./a.sh , sh a.sh , source a.sh, . ./a.sh的区别
在linux shell中, 执行shell script的方式有多种, 有什么区别呢? 现在用一个简单例子再来说下. a.sh的内容是: #! /bin/bash echo hello world ...
- 在shell中改变当前环境路径
在linux环境下,常有通过shell脚本进入指定目录的操作,例如有一段脚本chdir.sh: #!/bin/sh cd /home/user/Downloads pwd 在shell ...
- lua执行shell命令6_Vim执行shell命令及使用Vim批量更改文件名
写在前面:我"胡汉三"又回来了~上周顺利通过了试用期答辩,现在俺是一名正式的鹅厂人啦.哈哈哈~感谢各位可爱又热心的好伙伴对我的"不离不弃". 话休絮烦,今天分享 ...
- shell中执行脚本并显示到终端和保存到日志文件中
我们知道,在shell中执行脚本会返回一定信息到终端屏幕上 ,但是有一些特殊情况,如以下情况: 1)显示到终端中 echo "abck" 以上在手动执行脚本中是可以的,如果是编写 ...
最新文章
- Python案例:使用XPath的爬虫
- pjax php,ZBlogPHP简单实现pjax的一种方法
- 同时给两个变量值赋值
- 分享一道JS前端闭包面试题
- pytorch 笔记:gather 函数
- 全文检索引擎Solr系列——Solr核心概念、配置文件
- linux中shell如何输出换行符
- 多线程——实现Runnable接口实现一个多线程
- Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序
- dubbo provider异步_Dubbo相关面试题
- 数据科学 IPython 笔记本 8.8 直方图,分箱和密度
- 又是一个github吗? Kubernetes 初创公司 Heptio被VMware 收购
- JS向NPAPI传递参数,并返回结果
- 计算机领域CCF推荐会议列表
- 电子元器件选型——MOSFET
- InVEST实践与进阶及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中的具体应用
- 从客户需求开始你的供应链管理战略
- 基本的 DBus 偵錯技巧
- c语言设计一个语音识别程序,用 C# 开发自己的语音识别程序
- 可以使用ActualHeight来判断textblock是否已经trimming
热门文章
- 在线作图丨做一张叠加mantel test的相关性热图
- 结果方程模型(SEM)的理论和基本实现过程
- Science:固氮(The nitrogen fix)
- 来者不拒,“昊”课等你——直播微生物篇
- Lancet:支持奋战在疫情一线的中国科研技术工作者
- 关于新冠肺炎的一切|回形针
- 可持续农业生态系统中的核心微生物组
- PJ:细菌挥发性物质和光合信号激活低铁响应途径
- R语言ggplot2可视化散点图、移除可视化图像中的网格线(remove gridlines)
- R语言使用ggplot2包使用geom_density()函数绘制分组密度图(自定义调色板、brewer、灰度比例)实战(density plot)