Shell从入门到精通(光盘内容另行下载,地址见书封底)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-12 07:43:45

点击下载

作者:张春晓

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Shell从入门到精通(光盘内容另行下载,地址见书封底)

Shell从入门到精通(光盘内容另行下载,地址见书封底)试读:

前言

随着互联网技术的发展,Linux已经逐步成为主流的服务器操作系统。在Linux系统中,Shell是用户与系统内核之间进行交互的接口,是整个Linux系统中非常重要的一个组成部分。Shell脚本编程成为一个优秀的系统管理员和Linux开发者必须掌握的技术之一。Bash Shell已经成为绝大部分Linux系统默认的Shell程序,本书旨在系统介绍Shell编程的相关知识和技巧。

在Shell发展的几十年中,出现了许多介绍Shell编程的书籍。但是,大多数相关书籍的内容比较陈旧,其内容并没有随着技术的发展而得到补充。另外,许多书籍要么偏重理论,缺乏实践性;要么泛泛而论,缺乏深入的阐述。本书由有着十几年实践经验的一线技术员编写,以实用性为主旨。从最基本的Shell编程环境的搭建和变量开始,一直到Shell脚本的调试技术,由浅入深,系统地介绍了Shell编程各个方面的知识点。最后通过2个具体的综合实例,向读者介绍了如何使用Shell脚本来解决实际问题。关于“Linux典藏大系”“Linux典藏大系”是清华大学出版社自2010年1月以来陆续推出的一个图书系列,截止2013年,已经出版了10余个品种。该系列图书涵盖了Linux技术的方方面面,可以满足各个层次和各个领域的读者学习Linux技术的需求。该系列图书自出版以来获得了广大读者的好评,已经成为Linux图书市场上最耀眼的明星品牌之一。其销量在同类图书中也名列前茅,其中一些图书还获得了“51CTO读书频道”颁发的“最受读者喜爱的原创IT技术图书奖”。该系列图书在出版过程中也得到了国内Linux领域最知名的技术社区ChinaUnix(简称CU)的大力支持和帮助,读者在CU社区中就图书的内容与活跃在CU社区中的Linux技术爱好者进行广泛交流,取得了良好的学习效果。本书有何特色1.视频讲解,高效学习

为了帮助读者更加高效、直观地学习,作者为本书每章的重点内容专门录制了对应的配套多媒体教学视频。这些视频和本书实例源文件一起收录于配书光盘中。2.内容全面,系统性强

本书非常全面地讨论了Shell编程各个方面,基本上涵盖了与Shell编程有关的所有重要的知识点。3.深入浅出,循序渐进

对于绝大部分的初学者来说,Shell编程是一件非常困难的事情。为了能够适应初学者的学习习惯,本书从最基本的基础知识开始讲起,一直到最后的Shell脚本调试技术。在介绍某个知识点的时候,本书也尽量从最简单的内容开始,逐步深入,避免使初学者产生畏惧的心理。4.由一线技术人员编写,重实践,实用性强

本书以当前最为流行的Bash Shell为基础,针对Shell编程中最容易遇到的问题,依次展开论述。无论是初学者,还是具有一定经验的Linux开发和维护人员,都可以从中获得有用的知识。5.重点突出,脉络清晰

对于比较重要的知识点,本书都进行了非常深入的探讨和代码演示,使读者不仅知其然,更要知其所以然,只有这样,才能达到融会贯通的境界。6.项目案例典型,实战行强,有较高的应用价值

本书最后一篇提供了2个综合案例。这些案例来源于作者所开发的实际项目,具有很高的应用价值和参考性。而且这些案例分别使用不同的框架组合实现,便于读者融会贯通地理解本书中所介绍的技术。这些案例稍加修改,便可用于实际项目开发中。本书内容及知识体系

第1篇 认识Shell编程

(第1~2章)

本篇主要介绍了Shell入门的基础和Shell编程环境的搭建。主要包括什么是Shell、为什么要学习Shell编程、最简单的Shell程序的组成、如何在不同的操作系统上面搭建Shell编程环境,以及编辑器的选择等。第2篇 Shell编程基础(第3~13章)

本篇主要介绍了Shell编程所涉及的所有重要的知识点。主要包括Shell变量、条件测试和判断语句、循环结构、函数、数组、正则表达式、基本文本处理、流编辑、awk工具、文件操作,以及子Shell与进程处理等。第3篇 Shell编程实战(第14~15章)

本篇主要介绍了Shell脚本的调试技术及2个综合实例。主要包括Shell编程常见问题、4种常用的Shell脚本调试技术。综合实例包括系统服务脚本,以及Apache日志管理脚本的编写方法。适合阅读本书的读者

□ 需要全面学习Shell编程技术的人员;

□ 广大Linux程序员;

□ Linux系统管理员;

□ 网站管理工程师;

□ 希望提高Linux系统管理和开发水平的人员;

□ 专业培训机构的学员;

□ Linux下的所有编程人员;

□ 需要一本案头必备查询手册的人员。阅读本书的建议

□ 没有Linux编程基础的读者,建议从第1章顺次阅读并演练每一个实例。

□ 拥有一定Linux编程基础的读者,可以根据实际情况有重点地选择阅读各个章节及实例。

□ 对于每一个知识点和实例,先自己思考一下实现的思路,然后再阅读,学习效果会更好。

□ Shell编程非常需要大量的实际操作,并且每项功能都会有多种实现方法。所以读者可以在阅读本书知识点以及实例的基础上,对本书的实例进行改编,以其他的方式实现实例的功能。这样理解起来就更加容易,也会更加深刻。关于作者

本书由张春晓主笔编写。其他参与编写的人员有魏星、吴宝生、伍远明、谢平、顼宇峰、徐楚辉、闫常友、阳麟、杨纪梅、杨松梅、余月、张广龙、张亮、张晓辉、张雪华、赵海波、赵伟、周成、朱森。

您在阅读本书的过程中若有疑问,请发E-mail和我们联系。E-mail地址:bookservice2008@163.com。编著者第1编认识Shell编程第1章Shell入门基础

随着Linux和UNIX的广泛应用,Shell日益成为系统管理员的一个非常重要的工具。作为一个优秀的系统管理员或者Linux/UNIX开发者来说,熟练掌握Shell程序设计可以使得工作达到事半功倍的效果。

本章从最基本的Shell概念入手,依次介绍了作为程序设计语言的Shell、向Shell脚本传递参数,以及通过一个最简单的例子来说明如何进行Shell程序设计。

本章主要涉及的知识点如下所述。

□ 为什么学习和使用Shell编程:主要介绍Shell在日常管理工作中的重要作用。

□ 什么是Shell:主要介绍Shell的基本概念、起源、功能和分类等。

□ 作为程序设计语言的Shell:主要介绍什么是交互式程序、如何创建脚本,以及如何将脚本设置为可执行。

□ 向脚本传递参数:主要介绍什么是脚本参数,以及脚本参数的用途等。

□ 第一个Shell程序:通过一个简单的例子来向读者介绍Shell脚本的基本元素、注释和风格、如何执行Shell程序,以及Shell程序的退出状态。1.1 为什么学习和使用Shell编程

对于一个合格的系统管理员来说,学习和掌握Shell编程是非常重要的。通过编程,可以在很大程度上简化日常的维护工作,使得管理员从简单的重复劳动中解脱出来。作为本书的第一节,将介绍学习和使用Shell编程的重要性。

作为程序设计语言来说,Shell是一种脚本语言。脚本语言是相对于编译型语言而言的,前者毋需编译,而是由解释器读取程序代码并且执行其中的语句;后者则是预先编译成可执行代码,在使用的时候可以直接执行。

脚本语言的优点在于简单易学,因此,任何人在了解了基本的知识之后都可以毫不费力地编写出一个简单的脚本。关于这一点,在本章的最后一节中将通过一个简单的例子来说明。然而,Shell尽管非常容易上手,但是如果想真正精通Shell编程却不是一件容易的事情。这是因为Shell的语法非常灵活,又涉及Shell中的许多命令。想要真正透彻地了解Shell程序设计,必须下一番功夫才可以。1.2 什么是Shell

在学习Shell编程之前,必须弄清楚什么是Shell。为了能够使读者在学习具体的Shell编程之前对Shell有个基本的了解,本节将对Shell进行概括性的介绍,包括Shell的起源、功能和分类。1.2.1 Shell的起源

Shell的起源与计算机世界里面最古老的操作系统UNIX有着密不可分的关系。在1964年,美国AT&T公司的贝尔实验室、麻省理工学院及美国通用电气公司共同参与开始研发一套可以安装在大型主机上的多用户、多任务的操作系统,该操作系统的名称为Multics(MULTiplexed Information and Computing System),运行在美国通用电气公司的大型机GE-645上面。但是由于整个目标过于庞大,糅合了太多的特性,Multics虽然发布了一些产品,但是性能都很低,最终以失败告终。1969年,AT&T最终退出了Multics的开发。但是,该公司其中一位开发者,肯·汤普逊(Kenneth Lane Thompson)则继续为GE-645开发软件。

大约在1970年,另外一位开发者丹尼斯·里奇(Dennis MacAlistair Ritchie)也加入了汤普逊的开发队伍,如图1-1所示。在汤普逊和里奇的组织和领导下,他们启动了另外一个新的多用户、多任务的操作系统的项目,他们把这个项目称之为UNICS(UNiplexed Information and Computing System)。后来,人们取这个单词的谐音,把这个项目称为UNIX。

最初的UNIX完全采用汇编语言编写,因此可移植性非常差。为了提高系统的可移植性和开发效率,汤普逊和里奇于1973年使用C语言重新编写了UNIX。通过这次编写,使得UNIX得以移植到其他小型机上面。

与此同时,第一个重要的标准UNIX Shell于1979年末在UNIX的第7版中推出,并以作者史蒂夫·伯恩(Stephen Bourne)的名字命名,叫做Bourne Shell,简称为sh。Bourne Shell当时主要用于系统管理任务的自动化。此后,Bourne Shell凭借其简单和高效而广受欢迎,很快就成为流行的Shell。虽然Bourne Shell广受欢迎,却缺少一些交互的功能,如命令作业控制、历史和别名等。

而在这时,UNIX的另外一个著名分支BSD UNIX也悄然兴起,随着风头正劲的BSD,另一个老牌Shell也登场了,它就是比尔·乔伊(Bill Joy)在加州大学伯克利分校读书期间开发的C Shell。C Shell开发于二十世纪七十年代末,作为BSD UNIX系统的一部分发布,简称csh。乔伊是美国SUN公司的创始人之一,当年在伯克利分校时主持开发了最早版本的BSD,如图1-2所示。图1-1 汤普逊和里奇图1-2 比尔·乔伊

C Shell基于C语言,作为编程语言使用时,语法也类似于C,所以程序员可能会很喜欢它。此外,C Shell还提供了增强交互使用的功能,如作业控制、命令行历史和别名等。当然,C Shell的缺点和其优点一样明显,由于它是为大型机设计并增加了很多新功能,所以,C Shell在小型机上运行比较慢。更为麻烦的是,即使在大型机上,C Shell的速度也不如Bourne Shell,而这个问题,在当时的硬件条件下可以说是致命弱点了。

C Shell之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh),以及GNU Bourne-Again shell(bash),关于这些Shell的特点,不再详细介绍。说明:目前,无论是在UNIX系统中,还是在Linux系统中,比较流行的Shell程序都是bash。1.2.2 Shell的功能

Shell这个单词的意思是“外壳”,它形象地表达出了Shell的作用。在UNIX以及Linux中,Shell就是套在内核外面的一层外壳,如图1-3所示。正因为有Shell的存在,才向普通的用户隐藏了许多关于系统内核的细节。图1-3 UNIX/Linux Shell

Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大得多。在UNIX或者Linux中,Shell既是用户交互的界面,也是控制系统的脚本语言。1.2.3 Shell的分类

关于Shell的分类,在介绍Shell的历史的时候已经简单地介绍过一些了,下面对各种Shell程序做一个简单的概括。常见的几种Shell程序如下所述。

□ Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多UNIX系统中,该Shell是root用户的默认的Shell。

□ Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多数Linux发行版的默认的Shell。

□ Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容Bourne Shell并包含了C Shell的很多特性。

□ C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因此称为C Shell。

对于这些Shell程序,其语法或多或少都有所区别。目前大部分人仍然建议使用标准的Bourne-Again Shell。1.3 作为程序设计语言的Shell

Shell不仅仅是充当用户与UNIX或者Linux交互界面的角色,还可以作为一种程序设计语言来使用。通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。本节将介绍作为程序设计语言的Shell的一些特性。1.3.1 交互式程序

现在读者已经对Shell有了初步的了解,接下来的内容将要逐步接触到真正的Shell脚本程序了。通常情况下,Shell脚本程序有以下两种执行方式:(1)用户可以依次输入一系列的命令,交互式地执行它们;(2)用户也可以把所有的这些命令按照顺序保存在一个文件中,然后将该文件作为一个程序来执行。

下面我们首先介绍交互式执行Shell程序。

在命令行上直接输入命令来交互式地执行Shell脚本是一种非常简单的方式。尤其是在测试Shell程序的时候,通过使用交互式方式,可以非常方便地得到程序执行的结果。【例1-1】 该例子的作用是在当前目录中查找文件名包含“xml”这3个字符的文件。如果找到的话,则在当前屏幕上打印出来。我们可以在Shell提示符后面依次输入下面的代码:

每当输入完一行后,都要按回车键换行。当我们输入完第8行之后,Shell开始执行输入的代码,第9行~第14行是Shell程序的输出结果。从结果中可以得知,当前目录中有6个文件的文件名包含“xml”这3个字符。注意:当Shell期待用户下一步的输入时,正常的Shell提示符“#”将会改变为“>”。用户可以一直输入下去,由Shell来判断何时输入完毕并立即执行程序。

关于上面的程序所涉及的语法,我们将在后面的内容中依次介绍。在此读者只要掌握交互式执行程序的方法即可。

尽管上面的执行方法非常方便快捷,但是,如果每次在执行同一个程序的时候都要重新输入一次将会非常麻烦。此外,如果对程序不是很清楚的情况下,则容易发生输入错误,导致程序不能执行。因此,在实际开发中,这种交互式执行程序的方式并不常见。而是采用将这些语句写入一个脚本文件作为一个程序来执行。1.3.2 创建脚本

对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行是一种非常明智的做法。我们通常称这种包含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件都是普通的文本文件,可以使用任何的文本编辑器查看或者修改Shell脚本文件。【例1-2】 使用vi命令创建Shell脚本文件。在Shell命令行中输入vi命令,然后输入以下代码:

从上面的代码可以得知,Shell程序中的注释以“#”符号开始,一直持续到该行的结束。请注意第一行#! /bin/sh,它是一种特殊形式的注释,其中,“#! ”字符告诉系统同一行中紧跟在它后面的那个参数是用来执行本文件的程序。在这个例子中,/bin/sh是默认的Shell程序。1.3.3 把脚本设置为可执行

当将脚本编辑完成之后,这个脚本还不能马上执行。在Linux中,当用户执行某个程序时,必须拥有该文件的执行权限。用户可以通过ls -l或者ll命令来查看文件的访问权限,其中ll命令只可以在Linux中使用。下面是ll命令的执行结果:

在上面的输出结果中,每一行都是一个文件的描述信息。一共包括6列,其中第一列就是文件的访问权限。通常情况下,每个文件的访问权限都由9位组成,其中最前面的3位表示文件的所有者对于该文件的访问权限,中间的3位表示与所有者同组的其他用户对于该文件的访问权限,最后3位表示其他组的用户对于该文件的访问权限。

在每一组权限中,都用3个字母来表示3种不同的权限,r表示读取权限,w表示写入权限,x表示执行权限。

我们可以发现,在上面的ex1-2.sh文件的权限描述中,任何用户都没有该文件的执行权限。因此,该文件无法直接执行。

为了使得用户拥有某个文件的执行权限,我们可以使用chmod命令。该命令的基本语法如下:

其中,options表示各种权限选项。用户可以使用r、w及x这3个字母分别表示读取、写入和执行的权限,也可以使用数字来表示权限。在数字模式下,4表示读取权限,2表示写入权限,1表示执行权限。另外,用户还可以指定执行权限授予的对象,其中u表示文件的所有者,g表示所有者所属的组,o表示其他组的用户。在授予权限时,操作符加号“+”表示授予权限,减号“-”表示收回权限。

例如,下面的操作授予文件ex1-2.sh的所有者执行权限:

对于上面的权限,用户也可以使用数字来表示,如下:

在上面的命令中,作为选项的3个数字“744”分别表示文件所有者、所有者所属的用户组以及其他组的权限。其中7是由4、2和1这3个数字相加而得,4表示读取权限。

当授予用户执行权限之后,就可以执行该脚本了,如下:注意:777是一个特殊的权限,表示所有的用户都可以读、写和执行该文件。许多用户为了操作上的方便,会直接将该权限授予某些文件。通常情况下,这样的操作会带来安全隐患,因此,在将该权限授予用户时,一定要谨慎。1.4 向脚本传递参数

许多情况下,Shell脚本都需要接收用户的输入,根据用户输入的参数来执行不同的操作。本节将介绍Shell脚本的参数,以及如何在脚本中接收参数。1.4.1 Shell脚本的参数

从命令行传递给Shell脚本的参数又称为位置参数,这主要是因为Shell脚本会根据参数的位置来接收它们的值。在Shell脚本内部,用户可以通过一系列的系统变量来获取参数。这些变量的名称都是固定的,并且非常简单,只用1个字符表示,例如$0表示当前执行的脚本名称,$1表示传递给脚本的第1个参数等。表1-1列出了常用的与参数传递有关的系统变量。表1-1 常用的与参数传递有关的系统变量

通过表1-1,可以得知,Shell的位置参数按照0,1,2……的顺序从0开始编号。其中,0表示当前执行的脚本的名称,而1表示第1个参数。由单引号或者双引号引起来的字符串作为一个参数进行传递,传递时会去掉引号。注意:对于包含空白字符或者其他的特殊字符的参数,需要使用单引号或者双引号进行传递。

变量$@可以以“参数1”“参数2”“参数3”……的形式返回所有的参数的值,因此,$@与“$1”“$2”“$3”……是等价的。如果用户传递的参数中包含空格或者其他的特殊字符,需要使用$@来获取所有的参数的值,不能使用$*。

变量$*以“参数1参数2参数3……”的形式将所有的参数作为一个字符串返回。通常情况下,参数值之间通过空格、制表符或者换行符来隔开,在默认情况下使用空格。

变量$#返回传递给脚本的参数的数量,不包括$0,即排除脚本的名称。

另外,如果用户传递的参数多于9个,则不能使用$10来引用第10个参数。为了能够获取第10个参数的值,用户必须处理或保存第1个参数,即$1,然后使用shift命令删除参数1并将所有剩余的参数下移1位,此时$10就变成了$9,依此类推。$#的值将被更新以反映参数的剩余数量。【例1-3】 传递脚本参数。代码如下:

然后通过以下方式来执行:

在上面的代码中,向ex1-3.sh脚本传递了2个参数,其中第2个参数含有空格,所以需要使用双引号引起来。1.4.2 参数扩展

在上面的小节中,已经介绍了通过系统变量来获取脚本参数的值。对于简单的脚本而言,这已经足够了。因为用户完全可以通过变量$1、$2……来依次获得全部参数,还可以通过$#获得参数的个数。但是,在实践中,用户遇到的并不总是这种简单的情况。例如,用户需要编写一个脚本程序,并且这个脚本程序需要一个拥有许多值的参数,在程序中,用户希望根据这个参数的值来执行不同的操作。在这种情况下,单纯地依靠$1以及$2等变量已经不能满足需求了。此时,用户可以考虑使用参数扩展。

如果接触过UNIX或者Linux,那么用户已经对于ls命令不会陌生。ls命令可能是UNIX或者Linux系统中选项最多的命令了。例如,用户可以使用-l选项来以长格式的方式显示当前目录的内容。实际上,这个-l也是ls命令的一个参数。这个参数与前面介绍的参数的不同之处在于它拥有一个前导的连字符“-”。

用户可以在Shell脚本中使用同样的技术,这称为参数扩展。为了获取到这些参数的值,用户需要在Shell程序中使用getopts命令。【例1-4】 介绍如何使用参数扩展,代码如下。

对于上面的代码,我们不做过多的介绍,此处只是了解如何使用参数扩展。在代码的第7行中,getopts命令后面的双引号中的第一个冒号告诉getopts命令忽略一般的错误消息,因为此脚本将提供它自己的错误处理。p和q则是两个选项名称。选项后面的冒号表示该选项需要一个值。例如,在绝大部分的命令中,-f选项都可能需要一个文件名。

当找到某个选项时,getopts命令返回true。第二个参数是变量名optname,该变量将接收找到选项的名称。以上程序的执行结果如下:1.5 第一个Shell程序:Hello,BashShell!

通过前面几节的学习,读者已经接触到一些Shell程序了。在本节中,将介绍一个完整的Shell程序,使得读者能够掌握Shell程序的组成元素,并写出简单的程序。1.5.1 Shell脚本的基本元素

在学习任何程序设计语言的时候,似乎那个经典的Hello world!都是一个必不可少的例子。接下来,我们介绍如何在Shell语言中实现这个例子。【例1-5】 输出Hello world!,代码如下。

这是一个完整的Shell程序,对于拥有执行权限的用户来说,这也是一个可执行的Shell程序。上面的代码非常简单,实际上最主要的只有一行,即第5行,这一行的作用只是在控制台上面输出一行消息。

接下来执行一下这个程序,看看到底会出现什么结果,命令如下:

从上面的执行结果可以得知,这个程序已经得到了预期的结果。但是,读者可能会有疑问,作为一个Shell程序,应该具备哪些元素呢?分析上面的例子,可以得知,一个最基本的Shell程序,应该拥有第2行的:

关于这一行的作用,将在下面的内容中详细介绍。另外,第4行是一行注释,用来说明下面的代码的功能。第5行是echo语句,这一行是实现整个程序功能的代码。

所以,对于一个基本的Shell程序来说,应该拥有以下基本元素。

□ 第2行的“#! /bin/bash”。

□ 注释:说明某些代码的功能。

□ 可执行语句:实现程序的功能。

在接下来的内容中,将依次介绍这些基本的元素。1.5.2 指定命令解读器

当用户在命令行中执行一个脚本程序的时候,Shell会首先判断用户是否拥有该程序的执行权限。如果没有执行权限的话,Shell给出“Permission denied”的提示;否则,Shell会创建一个新的进程,解释并执行Shell程序中的语句。

但是,无论是在UNIX,还是在Linux中,通常会同时安装多个Shell程序,例如sh、bash或者csh等。而这些不同的Shell程序的语法会有些区别,那么到底使用哪个Shell来执行代码呢?

实际上,【例1-5】中的第2行的作用正是告诉当前的Shell,应该调用哪个Shell来执行当前的程序。我们再来回顾一下【例1-5】的第2行代码:

当用户在命令行中执行该程序时,当前的Shell会载入该程序的代码,并且读取其中的第2行,如果发现有“#! ”标识,则表示当前的程序指定了解释并执行它的Shell。然后会尝试读取“#! ”标识后面的内容,搜寻解释器的绝对路径。如果发现了指定的解释器,则会创建一个关于该解释器的进程,解释并执行当前脚本的语句。在【例1-5】中,当前的Shell会创建/bin/bash的进程,执行ex1-5.sh脚本文件中的语句。注意:用户应该在“#! ”标识后面指定解释器的绝对路径。

Shell脚本的这个规定使得用户可以非常灵活地调用任何解释器,而不仅仅限于Shell程序。下面介绍如何在脚本文件中指定其他解释器程序。【例1-6】 在PHP脚本文件中指定PHP语言的解释器,然后执行文件中的PHP代码,代码如下:

在上面的代码中,第3行指定解释当前文件的解释器的绝对路径,第5行是PHP代码的开始标识符,第7行使用print语句输出字符串“Hello world! ”,第8行是PHP代码的结束标识符。

该程序的执行结果如下:

用户还可以指定其他一些命令,例如more或者cat来显示当前程序的代码,请参见下面的例子。【例1-7】 指定more命令作为脚本文件的解释器,代码如下:

读者应该想象得到,该程序的执行结果会是什么样子。没错,该程序的执行结果是调用more命令来显示当前程序的代码,而不是执行程序中的代码本身。如下:

到此为止,读者对于“#! ”标识的作用有了比较深入的理解。从本质上讲,该标识的作用就是指定解释当前脚本文件的程序,至于最后的结果会是什么样子,还要看指定的程序。如果指定的是Shell或者某些程序语言的解释器,例如/usr/local/php5/bin/php,则会执行其中的代码;如果是其他一些程序,例如/bin/more,则会显示当前脚本文件的内容。1.5.3 Shell脚本中的注释和风格

通过在代码中增加注释可以提高程序的可读性。传统的Shell只支持单行注释,其表示方法是一个井号“#”,从该符号开始一直到行尾都属于注释的内容。例如【例1-5】中的第4行:

如果需要多行注释内容的话,则在每行注释的开头都要加上“#”,例如:

但是这并不意味着用户只能使用单行注释。实际上,用户还可以通过其他一些变通的方法来实现多行注释,其中,最简单的方法就是使用冒号“:”配合here document,其语法如下:【例1-8】 通过here document实现了多行注释,代码如下:注意:一个here document就是一段带有特殊目的的代码段,它使用I/O重定向的形式将一个命令序列传递到一个交互程序或者命令中,比如ftp、cat或者ex文本编辑器。

在【例1-8】中,我们是将BLOCK之间的代码重定向到一个不存在的命令,从而间接地实现了多行注释。1.5.4 如何执行Shell程序

在1.3.3节中,我们介绍了如何使得程序变得可执行。那就是修改脚本文件的访问权限。实际上,在Linux中,如果要执行某个Shell程序,用户可以通过3种方式来实现。这3种方式分别为:

□ 授予用户执行该脚本文件的权限,使得该程序能够直接执行。

□ 通过调用Shell脚本解释器来执行。

□ 通过source命令来执行。

关于第一种方法,前面已经详细介绍过了,不再重复说明。第二种方式就是将脚本文件作为参数传递给解释器,在通过这种方式执行脚本的时候,不需要用户拥有执行该脚本文件的权限,只要拥有读取该文件的权限即可。

对于【例1-5】,用户可以使用以下方式来执行:

在上面的命令中,/bin/bash是bash Shell的绝对路径。用户首先调用bash,然后bash会载入ex1-5.sh,并且解释其中的语句,最后给出程序的执行结果。

因此,对于第二种方式,用户首先调用的是解释器,然后由解释器解释脚本文件。而第一种方式则是直接在脚本文件中指定解释器,当前的Shell会自动调用指定的解释器,然后创建进程再执行脚本文件。所以,第一种方式和第二种方式在本质上是一样的。

source命令是一个Shell内部命令,其功能是读取指定的Shell程序文件,并且依次执行其中所有的语句。该命令与前面两种方式的区别在于只是简单地读取脚本里面的语句,并且依次在当前的Shell里面执行,并没有创建新的子Shell进程。脚本里面所创建的变量都会保存到当前的Shell里面。注意:由于source命令是在当前的Shell中执行脚本文件,因此其执行结果可能会与前面两种方式不同。

例如,【例1-5】也可以使用以下方式执行:1.5.5 Shell程序的退出状态

在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常都被解释成一个错误码。运行良好的UNIX命令、程序和工具都会返回0作为退出码来表示成功,偶尔也会有例外。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载