第一部分 热身
++++++++++++++++
shell是一个命令解释器.是介于操作系统kernel与用户之间的一个绝缘层.准确地说,它也是一一种强力的环境语言.一个shell程序,被称为一个脚本,是一种很容易使用的工具,它可以通过将系统调用,公共程序,工具,和
编译过的二进制程序粘合在一起来建立应用.事实上,所有的UNIX命令和工具再加上公共程序,对于shell脚本来说,都是可调用的.如果这些你还觉得不
够,那么shell内建命令,比如test与循环结构,也会给脚本添加强力的支持和增加灵活性.Shell脚本对于管理系统任务和其它的重复工作的例程来
说,表现的非常好,根本不需要那些华而不实的成熟紧凑的程序语言.
第1章 为什么使用shell编程
===========================
Herbert Mayer的话:没有一种编程语言是完美的。甚至也没有一种最好的语言;只有一种非常合适或可能非常不合适实际目标的语言。
脚 本应用知识对于希望相当精通系统管理的任何人来说是必需的,即使他实际上并不想写一个脚本程序。一般来说一个Linux机器启动后,它会执行在/etc
/rc.d 目录下的Shell脚本重建系统环境并且启动各种服务。理解这些启动脚本的细节对分析系统运作行为并修改它是意义重大的。
编写shell脚本不是很难学,因为脚本内建的功能集(check?)和他们只有相当少的shell的操作符和选项 [1]
需要学。语法非常的简单易懂,就像在命令行上调用和连接软件包一样容易,它仅有一些少量的 "规则"
需要掌握。大多数短小的脚本第一次就工作的很好,即使是较长的脚本调试也相当的容易。
shell脚本是一个复杂应用原型的"quick and dirty"
方法。在项目开发中用shell编程实现一个有限的功能性子集常常是有用的开始。用这种方法去测试应用程序的结构和模块组合,可以在实际地用
C,C++,Java或者Perl进行编程之前发现主要的设计缺陷。
Shell编程遵从经典UNIX哲学:把复杂的问题分解成简单的小问题,然后再把各部分功能组合起来解决复杂问题。这和用新一代高级的多用途的语言,例如Perl,试图成为所有人处理所有事情的语言但是所付出的代价是强迫改变你的思维方法来适应这种工具,大多数人认为这是一个更好的或者至少感觉上更令人能接受的方法。
什么时候不适合使用Shell编程:
资源紧张的项目,特别是那些速度是重要因素的地方(排序,散序,等等)
程序要进行很复杂的数学计算,特别是浮点计算,任意精度的计算,或者是复数计算(应该用C++或是FORTRAN代替)
要求交叉编译平台的可移植性(使用C或者是Java代替)
需要结构化编程的复杂应用(需要变量类型检查和函数原型等等)
对于影响系统全局性的关键任务应用。
安全非常重要。你必须保证系统完整性和抵抗入侵,攻击和恶意破坏。
项目由连串的依赖的各个部分组成。
多种文件操作要求(Bash被限制成文件顺序存取,并且是以相当笨拙,效率低下的逐行的存取方式.
需要良好的多维数组支持。
需要类似链表或树这样的数据结构。
需要产生或操作图象或图形用户界环境。
需要直接存取系统硬件。
需要端口号或是socket I/O。
需要使用可重用的函数库或接口。
所有的私有的不开源的应用程序(Shell脚本的源代码是直接可读,能被所有人看到的
如果你需要有上环境的任意一种应用,请考虑其他的更强大的脚本语言――Perl,Tcl,Python,Ruby,或者可能是其他更高级的编译型语言,例如C,C++或者是Java。尽管如此,使用Shell脚本来构造应用原型仍然是一个有用的开发步骤。
我们将会使用Bash,它是 "Bourne-Again shell" 的首字母缩写,并且是Setphen Bourne写的经典的Bourne
shell的同义词。Bash已经变成了所有令人喜欢的UNIX上shell编程 事实的上的
这本书的大多数脚本技术能很好的应用到其他的Shell当中,比如说Korn Shell,Bash借用了它的一些特性, [2] 还有C
Shell和他的不同之处。(注意:C shell编程不是交付一定的内在问题,这点已由Tom Christiansen在1993年10月在 Usenet post
被指出了)
接下来是的是一篇脚本的指南。它由许多的例子来引出Shell的许多特性。这些已经被测试过的例子不仅能工作,并且可能的话某些甚至能用在真正的应
用中。读者能让源码文件(scriptname.sh或是 scriptname.bash)的这些例子真正地运行起来, [3] 给他们增加运行权限(chmod
u+rx scriptname), 然后运行他们看看运行结果。如果你没有源码包,你仍然可以从HTML, pdf, 或是text
格式版本中复制粘贴代码。注意这些脚本可能在他们被详细解释前提前展示一些特性,这时读者可以暂时忽略这些特性。
如果不是特别注明,后环境这些脚本例子是写这本书的 作者 所写的。
注
[1] 术语内建,是指它是Shell内部的特性。
[2] 许多ksh88的属性, 及一小部分的ksh93 中加入的属性已经被增加到了Bash中.
[3] 依照惯例,用户写的Bourne shell脚本应以
.sh作为扩展名。而系统脚本,比如说放在目录/etc/rc.d中的脚本则不用这种命名法。