Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting
Chapter 1. Why Shell Programming?
为什么要用shell编程?
没有一种编程语言是完美的。也不存在一种最好的语言;
只存在某种语言,它更适合或不适合某种特
定的应用。
----Herbert Mayer
对于任何想精通系统管理的人来说,了解shell脚本的工作机制是必要的,即使他们从来没
打算要去写一个脚本。在linux系统启动的时候,会运行目录/etc/rc.d下的脚本来恢复系统的
配置并对各种系统服务进行设置。理解这些启动脚本的细节,对分析和修改系统的动作是很
有帮助的。
写shell脚本并不难学,因为脚本可以订制的很小,且需要学习的操作和选项也不多。
shell的语法很简洁,很像是命令行的堆叠,而且要学习的规则也很少。大部分短的脚本第一
次就可以正常运行,即使是长的脚本调试起来也很方便。
对于一个复杂应用的原型来说shell脚本是一个快速而肮脏的实现。在工程的初期先写一个功
能有限的子集/模块是有用的,在用C, C++, Java, 或Perl编程的时候,这样的方法使工程的
开发可以一边测试一边进行,并在最后编码前发现其中的主要缺陷。
shell脚本很好的继承了UNIX的哲学(把复杂的工程拆分成简单子集),使用组件和工具的组
合来完成任务。很多人认为这样更好或者说是更合理的解决问题的方法,而不是使用一种功
能强大涵盖一切的语言,比如Perl,它试图要替所有人解决所有问题,这需要你花费精力转
变思想去适应这种工具。
什么情况下不用shell脚本:
>对资源要求敏感的任务,特别是速度是主要的考虑因素时候(比如说排序、散列等)。
>需要进行繁重的数学运算,特别是浮点运算、非常精确或复杂的数字(用C++或FORTRAN代替)。
>需要交叉平台的可移植性(用C或java代替)。
>复杂的应用,需要严格的模块化编程(需要类型检查、函数原型声明等)。
>对安全性要求很高的地方,你需要保证系统的完整性,防止入侵、攻击和故意破坏。
>工程的子模块之间有较强的依赖性的时候。
>需要对很多文件进行操作的时候(Bash只能一个一个的去访问文件,而且它只会很笨拙的逐行去执行)。
>需要内在支持多维数组的时候。
>需要某些数据结构,比如链表和树。
>需要处理图像或GUIs的时候。
>需要直接访问系统硬件的时候。
>需要端口或socket I/O操作的时候。
>需要使用已有的特定库或接口的时候。
>私有的封闭的开发模式(shell脚本的代码对全世界都是开放的)。
如果上面的任何一种应用使用了一个更强大的脚本语言----Perl, Tcl, Python, Ruby或者一种高
级编译语言,比如C, C++, or Java,即使是这样,用shell构建这个应用的原型/框架也是很
有用处的。
我们将使用Bash(Bourne-Again shell的缩写,是现在经典得Stephen Bourne的Bourne shell
的双关语)。在所有流行的UNIX上Bash已经变成一个事实上shell编程的标准。这本书里的
大部分用法在其他shell上也适用,比如ksh(Bash从它那儿借鉴一些特性)、Csh和它的变种。
(注意:因为自身的某些原因我们不建议使用Csh编程,这一点是1993年10月Tom
Christiansen在Usenet post上指出的)。
接下来就是我们的shell脚本之旅,并重点用例子和图表的方法向大家展示shell的各种特性。
那些脚本实例都是经过的测试的,而且有一些在我们的日常生活当中很有用处。读者可以实
际运行压缩包里那些原码文件(形如scriptname.sh / scriptname.bash的文件),先给它们加上
可执行权限(chmod u+rx scriptname),再运行看有什么事情发生。可能没有直接提供原码文
件,那么请从HTML, pdf, or text文档中拷贝下来。需要明白一点这儿提供的一些脚本是先介
绍特性再进行解释,这可能需要读者在阅读时先跳过一些东西。
[ 本帖最后由 yjh777 于 2006-5-15 09:57 编辑 ] |