
Shell是Unix/Linux操作系统与用户进行交互的重要接口,是Unix/Linux系统中最重要的软件之一。一直以来,Shell编程都是系统管理员必备的高级技能,通过学习Shell编程,可以让计算机系统去完成那些繁重并且琐碎的管理任务,从而可以节省大量的工作时间。本书通过大量的实例,以循序渐进的方式,由浅入深地逐步介绍Shell编程的各个知识点,从而引领读者轻松跨越Shell程序设计的门槛,最终摆脱繁忙而且低效率的工作状态,达到轻松管理系统的目的。 本书结合大量的实例,系统、全面地介绍了Shell脚本编程语言的语法格式,常用命令的使用,面对问题的分析方法,以及整个系统背后的运行原理等内容,力求使读者掌握从问题分析到代码实现,再到调试脚本、优化脚本的整个流程。阅读完本书以后,读者能够具备较强的Shell程序设计能力,并对系统背后的运行原理有深入的理解。
前言 Shell是Unix/Linux操作系统与用户进行交互的重要接口,是Unix/Linux系统中最重要的软件之一。一直以来,Shell编程都是系统管理员必备的高级技能,通过学习Shell编程,可以让计算机系统去完成那些繁重并且琐碎的管理任务,从而可以节省大量的工作时间。本书通过大量的实例,以循序渐进的方式,由浅入深地逐步介绍Shell编程的各个知识点,从而引领读者轻松跨越Shell程序设计的门槛,最终摆脱繁忙而且低效率的工作状态,达到轻松管理系统的目的。 如果你已经是一个Unix/Linux系统的使用者,或者希望将来能够从事Unix/Linux系统方面的工作,那么本书一定是你所需要的。本书并不要求你有多少系统管理方面的经验,如果你已经能够在命令行使用简单的命令,那么马上就可以上手编写脚本程序;如果你没有这方面的经验也不必担心,在本书的开始会给出这方面的介绍,一步一步带你进入精彩的脚本世界。 本书内容 本书结合大量的实例,系统、全面地介绍了Shell脚本编程语言的语法格式,常用命令的使用,面对问题的分析方法,以及整个系统背后的运行原理等内容,力求使读者掌握从问题分析到代码实现,再到调试脚本、优化脚本的整个流程。阅读完本书以后,读者能够具备较强的Shell程序设计能力,并对系统背后的运行原理有深入的理解。本书适合系统管理员、网络管理员、Unix/Linux系统爱好者学习参考。 本书的主要内容如下。 (1)第1章Shell介绍和脚本基础:讨论了有关Shell编程的一些重要概念,以及Shell编程所使用的基本工具和基本方法。 (2)第2章操作文件和目录:介绍了在Unix/Linux系统中操作文件和目录所使用的各种命令工具,如对文件和目录的复制、移动等,同时还讲述了文件和目录访问权限的有关知识。 (3)第 3 章输入/输出重定向和管道:讲述了系统中所有命令的共同点,即每一个命令都会有标准输入、标准输出和标准错误输出,同时还讲述了如何通过管道来改变这些输入/输出。 (4)第4章进程:讲述了如何启动和终止一个进程,以及前台进程与后台进程的区别。 (5)第 5 章文本处理和字符串操作:介绍了文本处理的相关工具和方法,这些工具与管道结合在一起使用可以构成强大而复杂的功能。 (6)第6章变量:讲解了变量在Shell脚本程序中的作用及相关的使用方法,如如何创建和删除变量,此外还介绍了有关环境变量的知识。 (7)第7章流程控制:介绍了在Shell编程中所使用的各种流程控制语句,包括各种分支结构和循环结构。 (8)第8章替换:介绍了 4 种类型的替换及它们在脚本程序中所发挥的作用,它们分别是文件名替换、变量替换、命令替换及算术替换。 (9)第9章引用:讲解了引用的概念和各种引用的使用方法,以及它们之间的区别,同时还讲述了引用对于各种替换的效果。 (10)第10章函数:讨论了有关脚本中函数的用法。通过使用函数可以使脚本程序更加结构化,更加模块化,同时可以大大地提高脚本程序的开发效率。 (11)第11章其他常用工具:介绍了在系统管理及开发脚本过程中经常用到的一些工具,如find命令,xargs命令,下载工具和数据文件的压缩备份工具。 (12)第12章处理信号:阐述了系统中信号的概念,同时讲解了如何发送信号及如何使用trap命令处理各种信号。 (13)第13章使用sed处理文本:讲述了正则表达式的基本知识,同时还结合正则表达式讲解了强大的流编辑器sed。 (14)第14章使用awk处理文本:讲解了另外一个强大的文本过滤工具awk,并且对awk与流编辑器sed进行了比较。 (15)第15章grep和高级正则表达式:介绍了文本内容搜索工具grep命令,并通过grep命令继续介绍了正则表达式的很多高级使用方法。 (16)第16章debug Shell脚本:讲解了在Shell脚本的开发过程中经常会犯的一些错误,以及如何利用Shell所产生的错误信息来确定问题的位置,同时还讨论了Shell内建的各种debug工具,以及在debug过程中经常使用的一些方法。 如何阅读本书 本书试图通过实际案例和现场解答的方式,讲述Shell脚本编程过程中的各个知识点。读者在遇到每一个实际的需求案例时,可以先不直接查看解决方案,而是通过自己已有的知识结构看是否可以解决所面临的问题;也可以先查询系统中的手册,看是否能够找到解决问题的方法,然后再与作者给出的解决方案进行对比,这样做的好处是不仅加深了对知识点的理解,还可以锻炼读者分析问题、解决问题的能力。在计算机的世界里,你随时都可能遇到各种各样的问题,并不是所有的问题都可以在书本中找到答案,因此我们需要的是能够分析问题,对已有知识灵活运用并举一反三的能力,这也是本书作者最为看重的一点。因此,在每一个实际案例的分析中,本书都会从开发者面对当时问题的思考过程的角度来进行描述,一步步引领读者学会这种开发过程中的思维过程。 此外,由于Shell编程中的各部分知识是相互交织缠绕在一起的,本书中各章节的前后顺序只是作者认为相对比较合理的一条学习路径,所以难免会出现前面的知识要用到后面知识的情况,此时读者可以适当地“囫囵吞枣”,只要能够理解一段代码所实现的大体功能即可,而不必在第一次阅读时就搞懂每一个细节,可以在后面专门介绍这个知识点的章节中再深入地学习。总之,如果眼前有不懂或想不明白的问题,可以暂时先忽略它,等到一段时间以后,这些问题自然会得到解决。 在本书中,读者可能会觉得有些很“简单”的问题都被列了出来,甚至显得有些啰嗦。这是因为对有些读者来说某一个问题可能很简单,但是另外一些读者可能对这部分知识比较生疏,从而对这个问题怎么也想不通,因此笔者宁可让内容写得啰嗦点,也不让一些重要的细节被遗漏。但是如果涉及的细节在前面的章节已经讲过,便会有意地略过。 本书的代码示例力求简单易懂,目的是为了尽可能地讲清楚每一个知识点,因此有些实例程序在现实脚本世界中是不会存在的,它们仅仅是为了学习之用,暂时并不考虑实际的用途。当然,如果读者有更好的实例程序,也很欢迎与作者进行沟通。 实例程序的获得和使用 本书中的实例代码可以通过登录华信教育资源网(www.hexdu.com.cn)免费注册后下载获得,下载以后得到的是一个源代码程序的zip压缩包,在Linux系统中使用解压工具解开以后,可以看到所有的程序实例都按章节进行了分类。读者在学习某一章时,可以进入相应的章节目录,阅读并执行实例程序。同时,在本书中引用源代码实例的地方,也都用[filename.sh]的形式标识了对应的程序文件名,以方便读者测试使用。对于那些在Shell命令行输入的命令,并没有对应的源代码,需要读者自己在Linux系统中输入这些命令来进行验证。 致谢 本书由张泽编著,在本书完成之际,感谢我的朋友和家人的支持和鼓励,是他们让我一直坚持下来,并最终完成这部著作。 参加本书编写和审定工作的还有王坚宁、李龙、魏勇、张玉兰、高克臻、张秀梅、张云霞、周兴国、李辉、刘峰、徐浩、马建军、朱丽云、许小荣等。在此,编者对以上人员致以诚挚的谢意! 勘误和支持 由于作者的水平有限,加上写作时间仓促,书中难免会出现一些错误或不准确的地方,恳请读者批评和指正。如果有任何疑问或错误,可以通过Email与笔者共同讨论。笔者的联系邮箱:zhangze.linux@gmail.com。 编 者 2013年3月
目1录 第1章 Shell介绍和脚本基础 1 1.1 登录到系统 2 1.2 交互地执行命令 8 1.3 自定义Shell 15 1.4 获取帮助 21 1.5 一个简单的Shell脚本 24 1.6 远程操作 33 1.7 小结 35 第2章 操作文件和目录 37 2.1 列出文件 38 2.2 查看并改变当前目录 42 2.3 查看文件内容 54 2.4 统计文件行数和字数 60 2.5 创建文件和目录 61 2.6 删除文件和目录 64 2.7 重命名文件和目录 68 2.8 移动文件和目录 69 2.9 建立文件和目录的符号链接 72 2.10 复制文件和目录 74 2.11 文件所有者与访问权限 78 2.12 小结 90 第3章 输入/输出重定向和管道 91 3.1 标准输出 92 3.2 标准输入 99 3.3 标准错误输出 101 3.4 管道 105 3.5 块语句的输出和重定向 110 3.6 Here Document 114 3.7 文件描述符 115 3.8 小结 120 第4章 进程 121 4.1 查看进程 122 4.2 前台进程和后台进程 130 4.3 终止进程运行 142 4.4 /proc/文件系统 146 4.5 小结 150 第5章 文本处理和字符串操作 152 5.1 常用的文本操作 153 5.2 其他操作 165 5.3 小结 169 第6章 变量 171 6.1 普通变量 172 6.2 数组变量 178 6.3 环境变量 184 6.4 Shell变量 188 6.5 特殊变量 192 6.6 小结 201 第7章 流程控制 203 7.1 if/else语句 204 7.2 case语句 210 7.3 while循环 214 7.4 until循环 216 7.5 for循环 219 7.6 select循环 222 7.7 循环嵌套 227 7.8 break语句 230 7.9 continue语句 232 7.10 小结 235 第8章 替换 236 8.1 变量替换的高级形式 237 8.2 文件名替换 243 8.3 命令替换 246 8.4 算术运算替换 249 8.5 小结 251 第9章 引用 252 9.1 使用反斜杠 253 9.2 使用单引号 259 9.3 使用双引号 263 9.4 引用的其他应用 267 9.5 小结 273 第10章 函数 274 10.1 定义和使用函数 275 10.2 检查函数定义和取消函数定义 277 10.3 参数和返回数据 279 10.4 变量的作用域 288 10.5 递归调用 292 10.6 函数库 295 10.7 小结 297 第11章 其他常用工具 299 11.1 使用find查找文件 300 11.2 xargs 309 11.3 其他查找文件的方法 311 11.4 判断文件的类型 313 11.5 数据备份 315 11.6 压缩文件 318 11.7 文件备份 326 11.8 下载工具 331 11.9 小结 333 第12章 处理信号 335 12.1 如何表达信号 336 12.2 如何处理信号 338 12.3 忽略信号 346 12.4 定时器 349 12.5 小结 354 第13章 使用sed处理文本 355 13.1 sed如何工作 356 13.2 选择要操作的行 366 13.3 重用匹配到的字符串 376 13.4 小结 378 第14章 使用awk处理文本 379 14.1 awk如何工作 380 14.2 使用变量 392 14.3 控制语句 405 14.4 使用函数 413 14.5 小结 418 第15章 grep和高级正则表达式 419 15.1 grep的基本用法 420 15.2 高级正则表达式 425 15.3 小结 441 第16章 Debug Shell脚本 442 16.1 分析报错信息 443 16.2 进入debug模式 445 16.3 在脚本中添加debug功能 454 16.4 使用trap命令 460 16.5 小结 463 参考文献 464