在UNIX系统里,解决同一个问题往往有许多不同的方法。假定有一个问题,可以用许多不同的方法来解决。当然,有些技术将更加有效,因为使用了更少的系统资源,并且根据程序运行情况可以给用户反馈,或者给出更加详细和精确的结果。本书将通过生成shell脚本逐步解决现实世界中的UNIX问题和任务。shell脚本范围从使用一个伪随机数字产生器产生登录密码到使用rsync复制数据处理记录文件。解决问题的方法是宽泛且详细的。写一个好的shell脚本需要注意的细节包括对每一步的注释,以方便日后引用参考。其他细节包括:在需要时将许多合成命令组成一个单一的命令语句;为便于阅读将命令分成几行代码,或者减少理解性的概念;使一个脚本可读性好并在整个运行周期内容易维护。我们将看到用变量和文件储存数据的益处,用方法从命令行输出中剔除不需要的数据,为特定目的格式化数据等内容。另外,我们还将告诉读者怎样在shell脚本里编写和使用函数,以及这较没有函数的shell脚本的优越之处等。 本书面向所有的UNIX版本,重点覆盖对象包括AIX、HP-UX、Linux、OpenBSD和Solaris操作系统。本书配套的Web网站里包含书中的几乎每一个脚本。根据不同的UNIX版本需要,我们对许多shell脚本进行了重写。其他的shell脚本是平台无关的。这些脚本的重写是必要的,因为不同UNIX版本的命令语法和输出有时不尽相同。这种差异有时和从不同列中提取数据,或者使用一个不同的命令转换就可以得到相同的结果一样是很小的,也可能是将几个命令放在一起在不同的UNIX版本上实现同样的任务并得到类似的输出或结果这样比较大的。 本书的每一章都以用一个基本的概念实现一个任务作为开始,然后引出一些非常复杂和难懂的概念。一个shell脚本的主要目的是能够自动完成重复和复杂的任务,这可以减少按键错误,并且可以定时执行shell脚本。让系统告诉我们问题所在总比费时查找问题好。本书可以帮助我们主动有效地与系统打交道。在每一部分读者都将会获得更多的知识,使读者容易理解更复杂的思想。读者将会看到不同的解决现实任务实例的方法。本书不仅提供解决一个问题的方法,同时讨论不同方法解决同一个问题各自的优缺点。我们的目标是自信灵活地解决遇到的问题。给定一个任务,能用许多种方法加以解决,当学习完本书时,就会感到问题的解决方法是直接而易见的。 本书概要和技术 本书意欲作为学习工具和研究向导,旨在告诉读者怎样一开始就目标清晰地编写shell脚本来解决各种问题。本书大部分shell脚本技术都将7次涉及。每次都从不同角度触及主题,解决不同的问题。我发现这个技巧对于掌握材料是非常有好处的。 每一章的结尾都有练习,让读者编写一个新的脚本,或修改该章中出现的shell脚本。本书不是一本描述解决方案而是描述解决方案怎样实现的书籍。我力劝读者完整地学习完本书,你会受益匪浅。本书涵盖的shell脚本包括Bash、Bourne,但不包括Korn.C shell脚本。更高级的主题包括使用rsync复制数据,利用Dirvish生成快速备份,用记录文件解析数据等。 本书从一些细小的任务解决方案到一些相当高级的概念都有涉及,这使得从高中生和大学生到系统管理员都能从中获益。本书每一部分包含若干章。本书中的shell脚本是完整的shell脚本,这一点有别于市场上其他的shell脚本书。本书对各种解决方案,甚至shell脚本每一部分的微小细节都进行了完整的解释,这都是作者的哲理和心态的真正表达。 组织结构 本书的每一章都以日常生活中计算机世界里出现的典型UNIX问题作为开始。对于每一个问题,都定义了一个明确的目标。通过定义正确的命令语法解决shell脚本中的问题。在给出目标和命令语法之后,根据命令来创建shell脚本。接下来过滤命令输出,将不需要的数据剔除,或者可以从输出里提取所需要的数据。如果UNIX版本间的语法不同,那么将给出得到相同或类似结果的正确的语法。当做到这一点时,就可以更进一步地创建shell脚本选项,为用户提供更加灵活的命令行。 若需要针对不同操作系统对shell脚本进行重写,则会在章节的末尾给出一个合成shell脚本,除特殊说明外,它可以在本书研究的所有UNIX版本中运行。为实现最后这一步,我们在UNIX系统里使用了uname命令。根据操作系统的版本,通过使用一个简单的case语句就能执行正确的命令。如果这些你还未了解,不用担心,本书都有非常详细的说明。 每一章解决一个不同的现实问题。一些问题是非常复杂的,而其他的问题可能仅仅是让人很感兴趣。一些章节从不同的方面讨论了同一个问题,另一些章节将问题留给读者自己想办法解决——当然,书中会给出一些解决问题的提示。每一章解决现实问题,除有特殊说明外,不用参考本书其他的章节就可以读懂。但是也有一些材料在一章中做了详细的解释,在其他章节中略有提及。也正因为这些不同,我建议你从头到尾,认真研究每一章,做好每章后面的作业练习,因为这是一个难得的学习过程! 读者对象 本书面向那些通过命令行方式使用UNIX的用户。在本书中讨论的主题主要针对UNIX专业人员——计算机专业学生、程序员、程序分析员、系统操作员、系统管理员,以及任何希望在技术支持领域取得进步的人。初学者也会从本书中学到许多知识,尽管一些问题可能有点深奥。因此可能需要一本UNIX基础书籍,以解决一些问题。每位读者在阅读本书前都应该具备一些常用UNIX命令的知识,我们不会对基本的UNIX命令做详细的解释。 我接触UNIX是通过学习系统操作员怎样工作开始的。当时我希望有一本这样的书可以参考。有了这样的经历,我想本书就可以让其他人在UNIX研究中减少许多麻烦。写这本书所用到的知识都是我曾经遇到的问题。记得过去我不得不从操作手册中学习,而且一次只学习一个命令。使用本书作为学习向导,你将在逐渐壮大的UNIX领域快速进步,并且不会走许多弯路。 所需要的工具 为从本书的学习中获取更多知识,读者需要一台运行UNIX的计算机,尤其是AIX、HP-UX、Linux、OpenBSD和Solaris操作系统。你可以在标准PC上运行Linux、Solaris和OpenBSD操作系统,即使这些系统不能免费使用,它们也是非常便宜的。默认shell脚本应该设置成Bash或Korn shell。可以在命令行输入echo $SHELL获得默认shell脚本。本书中的所有shell脚本都不需要图形终端,但运行Gnome、CDE、KDE或X-Windows也不会有影响。这样可以同时在多个窗口里运行,并且可以在各种窗口间剪切和粘贴代码。 读者也需要有一个用起来很舒服的文本编辑器。UNIX操作系统提供了一个vi编辑器,许多操作系统都提供了emacs编辑器。当然你也可以使用KDE、CDE和Gnome系统提供的文本编辑器。记住:必须是以标准ANSII格式储存文件的文本编辑器。读者学习本书同样也需要一些时间和耐心以及开放、积极的心态。 另外,本书中的shell脚本和函数里用到的所有变量都是大写字母。之所以这样做,是因为如果能够快速找到代码中变量的具体位置,理解shell脚本是非常容易的。当你编写自己的shell脚本程序时,所有的shell脚本和函数变量应使用小写字母,因为操作系统和应用系统用到的大写字母表示环境变量,这一点非常重要。如果在编写过程中不够仔细,很可能就会用人为设置的值覆盖了关键的系统或应用变量值,从而破坏系统。不过这也依赖于变量在代码里的作用域。记住一句话:慎用大写字母变量! 本书的Web站点 本书配套的Web网站上包含了本书中讨论的所有shell脚本和大部分函数,这些函数可以很容易地剪切和粘贴到自己编写的shell脚本里,使得编写shell脚本的过程简单了许多。另外,可以把小段shell脚本直接复制到其他文件使用。小段脚本使得开始编写shell脚本上手很快。你需要做的事情就是填写以下信息:脚本名称、作者、日期、版本、平台等,当版本过时后,还要注明前一版本的信息。首先应该定义变量和函数,然后就可以将“BEGINNING OF MAIN”作为开始编写shell脚本的主体了。 概述 本书旨在让读者学会如何创造性地、主动地、专业地解决现实系统中的问题。通过完整学习本书,给定一个任务,其解决方法就很显然了。本书将教会读者如何有条理地处理问题,以及用已学知识搭建程序的技巧。同时对于每个给定问题,读者将学习如何根据基本的命令语法来编写一个针对特定问题的shell脚本解决方案。本书的特点是从基础开始,然后在解决方案中加入越来越多的判断逻辑,在给终端用户添加附加选项前,使用户更加灵活地使用shell脚本解决方案。 对于终端用户,必须让他们时刻清楚程序的进展情况。如果用户看到的总是白屏,那会是一件很糟糕的事情。所以我们必须使用程序执行引导器。通过这种工具,显示器可以主动显示特定系统事件和即将面临的问题的初级阶段情况。 读者将学会本书中所有的技术。比如,你将学会许多问题的各种解决方案,或者根据具体情况以熟悉的方式作为开始建立一个有效的解决方案。你将学会怎样编写一个不用修改就可在其他平台运行的简单的shell脚本。你将学会怎样变得主动。你将学会使用shell脚本里大量的注释,学会编写易读的、逻辑性强的shell脚本。最基本地,你将成为一名有效率的问题解决者,对于遇到的任何问题,其解决方案都将是显而易见的。