shell 是一个命令解释器.是介于操作系统 kernel 与用户之间的一个绝缘层.准确地说,它也是一种强力的计算机语言.一个 shell 程序,被称为一个脚本,是一种很容易使用的工具,它可以通过将系统调用,公共程序,工具,和编译过的二进制程序粘合在一起来建立应用.事实上,所有的 UNIX命令和工具再加上公共程序,对于 shell 脚本来说,都是可调用的.如果这些你还觉得不够,那么shell 内建命令,比如 test 与循环结构,也会给脚本添加强力的支持和增加灵活性.Shell 脚本对于管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟紧凑的程序语言.
为什么使用 shell 编程
没有程序语言是完美的.甚至没有一个唯一最好的语言,只有对于特定目的,比较适合和不适合的程序语言. -- Herbert Mayer
对于任何想适当精通一些系统管理知识的人来说,掌握 shell 脚本知识都是最基本的,即使这些人可能并不打算真正的编写一些脚本.想一下 Linux 机器的启动过程,在这个过程中,必将运行/etc/rc.d 目录下的脚本来存储系统配置和建立服务.详细的理解这些启动脚本对于分析系统的行为是非常重要的,并且有时候可能必须修改它.
学习如何编写 shell 脚本并不是一件很困难的事,因为脚本可以分为很小的块,并且相对于 shell 特性的操作和选项[1]部分,只需要学习很小的一部分就可以了.语法是简单并且直观的,编写脚本很像是在命令行上把一些相关命令和工具连接起来,并且只有很少的一部分规则需要学习.绝大部分脚本第一次就可以正常的工作,而且即使调试一个长一些的脚本也是很直观的.
一个 shell 脚本是一个类似于小吃店的(quick and dirty)方法,在你使用原型设计一个复杂的应用的时候.在工程开发的第一阶段,即使从功能中取得很有限的一个子集放到 shell 脚本中来完成往往都是非常有用的.使用这种方法,程序的结果可以被测试和尝试运行,并且在处理使用诸如 C/C++,Java 或者 Perl 语言编写的最终代码前,主要的缺陷和陷阱往往就被发现了.
Shell 脚本遵循典型的 UNIX 哲学,就是把大的复杂的工程分成小规模的子任务,并且把这些部件和工具组合起来.许多人认为这种办法更好一些,至少这种办法比使用那种高大全的语言更美,更愉悦,更适合解决问题.比如 Perl 就是这种能干任何事能适合任何人的语言,但是代价就是你需要强迫自己使用这种语言来思考解决问题的办法.
什么时候不使用 Shell 脚本
- 资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash 等等)
- 需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用 C++或 FORTRAN 来处理)
- 有跨平台移植需求(一般使用 C 或 Java)
- 复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型,等等)
- 对于影响系统全局性的关键任务应用
- 对于安全有很高要求的任务,比如你需要一个健壮的系统来防止入侵,破解,恶意破坏等等
- 项目由连串的依赖的各个部分组成
- 需要大规模的文件操作
- 需要多维数组的支持
- 需要数据结构的支持,比如链表或数等数据结构
- 需要产生或操作图形化界面 GUI
- 需要直接操作系统硬件
- 需要 I/O 或 socket 接口
- 需要使用库或者遗留下来的老代码的接口
- 私人的,闭源的应用(shell 脚本把代码就放在文本文件中,全世界都能看到)
如果你的应用符合上边的任意一条,那么就考虑一下更强大的语言吧--或许是 Perl,Tcl,Python,Ruby -- 或者是更高层次的编译语言比如 C/C++,或者是 Java.即使如此,你会发现,使用 shell来原型开发你的应用,在开发步骤中也是非常有用的.
Bash 是"Bourne-Again shell"首字母的缩写,也是 Stephen Bourne 的经典的 Bourne shell 的一个双关语,Bash 已经成为了所有 UNIX 中 shell 脚本的事实上的标准了,之后的学习都是学习Bash shell.