自己动手写一个简单的Shell之四:流程控制
来源:互联网 发布:企业电脑维护软件 编辑:程序博客网 时间:2024/05/18 01:10
Shell中的流程控制
前面我们实现了Shell的两个主要功能:运行命令和处理命令行。现在我们来简单实现Shell的第三个功能——可编程。任何一种编程语言都需要对流程进行控制,Shell也不例外,这里就简单实现在Shell中如何提供if控制语句。Shell中的if语句的作用与其他语言的if语句相同:条件检测。如果条件为正值,则有一部分代码被执行。不过这里有一点与其他语言不同,在Shell中,if语句有以下特点:
1、条件是一个命令,返回正值意味着命令运行成功。
2、exit(0)代表成功。
3、如果if后的条件是一系列的命令,那么最后一个命令的exit值被用作这个语句块的条件值,并由此来决定条件是否成立。
在Shell中if的工作流程主要如下:
1、Shell运行if之后的命令
2、Shell检查命令的exit状态
3、exit的状态为0意味着成功,非0意味着失败
4、如果成功,Shell执行then部分的代码
5、如果失败,Shell执行else部分的代码
6、关键字fi标识if块的结束
在Shell中增加if
现在已经知道if控制语句做什么,也知道它是如何工作的。那么如何在Shell中增加if语句呢?在前面的版本中,Shell的控制流从splitline直接到fork,每个命令都被直接传给exec。新增if语句后命令处理变得复杂,我们这里用process函数来处理。
process将脚本看作一个接一个的代码区域。第一个区域是then代码块,第2个区域是else代码块,第3个是在if语句之外的代码块。如下图所示,
114.jpg
对于不同的区域,Shell的处理方法是不同的。
1、if语句之外的区域,称为中立区。对于这类区域的代码,简单地度一条,分析一条,执行一条。
2、if和then之间的区域。这个区域中,Shell每执行一条命令就记录下它的退出状态
3、then到fi或else之间的区域。这个区域中,Shell如果遇到if语句就重复第2个处理方法。
4、else到fi之间的区域。在fi后又回到中立区。
Shell记录当前区域类型,还必须记录在WAIT_THEN区域中执行命令的结果。不同区域的处理方法不同,特定的区域与程序的特定状态联系在一起。proces通过3个函数来处理区域问题。
is_control_command返回一个布尔变量告诉process这条命令是脚本语言的一部分还是一条可执行的命令。
do_control_command处理关键字if、then和fi,每个关键字都是区域的界标。这个函数更新状态变量并执行必要的操作。
ok_to_execute根据当前的状态和条件命令的结果返回一个布尔值,说明能否执行当前命令。
下面是程序运行结果和源码(这里把原来一个文件分割成了几个文件):
121.jpg
点击此处下载ash.rar (文件大小:3K)
- 自己动手写一个简单的Shell之四:流程控制
- 自己动手写一个简单的Shell之二:运行程序
- 自己动手写一个简单的Shell之三:命令行解析
- 自己动手写一个简单的Shell之一:了解Shell
- 自己动手写一个简单的Windows shell扩展程序
- 自己动手写一个简单的bootloader
- 自己动手写一个简单的php模板引擎
- 自己动手写一个简单的MVC框架(第一版)
- 自己动手写一个简单的MVC框架(第二版)
- 自己动手写一个简单图片轮播的控件
- 自己动手写一个简单的MVC框架(第二版)
- 自己动手,写一个简单的线程池(1)
- 自己动手,写一个简单的线程池(2)
- 自己动手,写一个简单的线程池(3)
- 自己动手写简单的eventbus
- 自己动手写shell之chgrp,chown,chmod
- 自己动手写shell命令之more
- 自己动手写shell命令之who
- 模板函数中指针作为调用参数时模板参数的推导问题
- ORACLE 中ROWNUM用法总结
- Kernel中断处理模型
- DB2 数据库备份、恢复和前滚
- Oracle技巧
- 自己动手写一个简单的Shell之四:流程控制
- Hibernate学习笔记-----n+1问题
- Sql datetime 转化字符串
- 关键字volatile的用法
- 深入分析request_irq的dev_id参数作用
- Debugging by Watching -- strace
- 一个通过引用返回局部变量的列子
- WM应用开发的常见问题解答
- 日本禅僧入住弘法寺禅堂体验中国式禅修生活