具体描述
本书能够帮助你掌握UNIX操作系统的Bash、Perl、TclShell编程。
全书分12章,涵盖了有关Shell编程技巧和技术的全部内容。在书中,还可找到有
关如何创建程序的简单建议,有助于读者早日加入优秀程序员之行列。
DavidMedinets: UNIXShellProgrammingTools.
Originaleditioncopyright(C)1999byTheMcGraw-HillCompanies.Allrightsreserv-
ed.
Chineseeditioncopyright(C)2000byChinaMachinePress.Allrightsreserved.
本书中文简体字版由美国麦格劳希尔公司授权机械工业出版社独家出版,未经出
版者书面许可,不得以任何方式复制或抄袭本书内容。
版权所有,侵权必究。
作者简介
目录信息
译者序
前言
第一部分 基 础 篇
第1章 Shell简介
1.1存取权限问题
1.2运行Shell脚本
1.3Shell程序设计
1.4Shell计数
1.5Shell特性
1.5.1别名
1.5.2命令替换
1.5.3后台处理
1.5.4变量
1.5.5管道
1.5.6重定向
1.5.7模式匹配
1.5.8特殊字符
1.6Shell/Perl/Tcl间的联系桥
1.7小结
第2章 变量和运算符
2.1变量替换
2.2位置变量
2.3进程变量
2.4Bash引号规则
2.5运算符
2.5.1取模运算符
2.5.2按位运算符
2.5.3逻辑运算符
2.5.4赋值运算符
2.6表达式替换
2.7标准Shell变量
2.8影响命令的变量
2.8.1declare
2.8.2export命令
2.8.3let命令
2.8.4local命令
2.8.5readonly命令
2.8.6set命令
2.8.7shift命令
2.8.8typeset命令
2.8.9unset命令
2.9小结
第3章 过程
3.1在过程内部使用变量
3.2shift命令
3.3建立局部过程变量
3.4过程返回值
3.5小结
第4章 脚本执行命令
4.1exit命令
4.2trap命令
4.3if命令
4.4case命令
4.5for语句
4.6while命令
4.7until命令
4.8break命令
4.9continue命令
4.10小结
第5章 控制Shell
5.1创建命令表
5.2创建复合命令
5.3输入/输出重定向
5.3.1控制输入
5.3.2控制输出
5.3.3管道
5.3.4利用高级重定向
5.4读取输入
5.5使用“”文件
5.6使用设备文件
5.7使用exec
5.8使用eval
5.9使用后台进程
5.10小结
第6章 使用Perl
6.1Perl特性
6.2Perl入门
6.3Perl变量
6.3.1命名习惯
6.3.2标量
6.3.3数组
6.3.4hash
6.4使用静态信息
6.5使用倒引号字符串
6.6使用语句
6.6.1运算符
6.6.2函数
6.3.3语句
6.7使用文件
6.7.1读文件
6.7.2写文件
6.7.3文件检测运算符
6.8特殊变量
6.9对象
6.10使用模块
6.11小结
第7章 使用Tcl/TK
7.1Tcl的特点
7.2Tcl入门
7.3理解“替换”概念
7.3.1变量替换
7.3.2命令替换
7.3.3反斜线替换
7.4理解“成组”的概念
7.4.1用花括号成组
7.4.2用引号成组
7.5数据结构
7.5.1简单变量
7.5.2列表
7.5.3数组
7.6使用语句
7.6.1构建一个语句
7.6.2Tcl的内置命令
7.6.3expr命令
7.6.4编写过程
7.6.5标准控制结构
7.7使用文件
7.7.1读文件
7.7.2写文件
7.8超越Shel1
7.9小结
第8章 模式匹配
8.1Bash
8.1.1用于文件名的元字符
8.1.2变量的元字符
8.1.3case命令的元字符
8.1.4元字符和for命令
8.2Perl
8.2.1模式分隔符
8.2.2匹配运算符
8.2.3替换运算符
8.2.4转换运算符
8.3联编运算符(=~和!~)
8.3.1Perl模式匹配的元字符
8.3.2字符类
8.3.3量词
8.3.4模式存储
8.3.5模式优先
8.3.6扩展语法
8.3.7模式范例
8.4Tcl
8.4.1glob函数
8.4.2stringmatch函数
8.4.3regexp函数
8.4.4regsub函数
8.5小结
8.5.1Bash
8.5.2Perl
8.5.3Tcl
第二部分 使用工具集篇
第9章 检查工具
9.1basename命令
9.2cat命令
9.3cksum命令
9.4clear命令
9.5col命令
9.6cp命令
9.7csplit命令
9.8cut命令
9.9date命令
9.10diff命令
9.11echo命令
9.12env命令
9.13expr命令
9.14eval命令
9.15false命令
9.16fgrep命令
9.17find命令
9.18grep命令
9.19groff命令
9.20head命令
9.21info命令
9.22join命令
9.23kill命令
9.24less命令
9.25man命令
9.26mv命令
9.27nl命令
9.28ps命令
9.29pstree命令
9.30read命令
9.31rm命令
9.32sort命令
9.33split命令
9.34strings命令
9.35tail命令
9.36tee命令
9.37test命令
9.38tr命令
9.39true命令
9.40tty命令
9.41type命令
9.42uname命令
9.43uniq命令
9.44wc命令
9.45who命令
9.46write命令
9.47xargs命令
9.48小结
第10章 移植性问题
10.1脚本编程语言间的命令等价
10.1.1文件I/O
10.1.2变量类型
10.1.3循环命令
10.1.4判定命令
10.2不同平台间的移植
10.2.1Bash
10.2.2Perl和Windows32
10.2.3MacPerl
10.2.4Windows之下的Tc1
10.2.5MacOS之下的Tcl
10.3小结
第11章 调试概念
11.1语法错误
11.1.1不适当的格式
11.1.2丢失和错放了命令分隔符
11.1.3错拼的词
11.1.4不成对
11.2运行时错误
11.3崩溃
11.4调试技术
11.4.1Bash调试
11.4.2Perl调试
11.4.3打开报警
11.4.4在代码中使用strict
11.4.5一般调试
11.5调试工具
11.5.1Perl
11.5.2Tcl/Expect
11.6小结
第12章 定制工具
12.1更好的find命令
12.2更好的write命令
12.3“安全的”delete命令
12.4受限使用的注册Shell
12.5用户名字是什么
12.6创建适当的字母大写
12.7有用的信息、提示和警告
12.8文件计数
12.9取代命令
12.10小结
第三部分 附录
附录A Internet资源
附录B ASCII码表
· · · · · · (收起)
读后感
用户评价
坦白说,这本书的阅读难度对于一个完全的初学者来说,可能稍显陡峭。它似乎默认读者已经对操作系统的基本工作原理,比如进程间通信、文件描述符这些概念有一定的了解。但这恰恰是它的魅力所在——它不迎合“快餐式”学习,而是构建了一个坚实的知识体系。我印象最深的是关于性能优化的章节,作者没有停留在使用更少的进程这种表面功夫,而是深入到了I/O模型和系统调用的效率对比。例如,它会对比不同循环结构下,Shell解释器实际执行的系统调用次数差异,这种微观层面的分析,是你在其他任何工具类书籍中都难以找到的深度。对于那些需要处理海量数据流、进行高并发任务调度的开发者而言,书中的这些细节优化点,可以直接转化为生产环境中的巨大性能飞跃。它更像是一本参考手册与思想论著的结合体,需要反复查阅和咀嚼才能体会其深意。
这本关于UNIX Shell编程的书,读起来就像是给一个已经有点基础,但想深入挖掘系统底层逻辑的工程师准备的“武功秘籍”。它没有那种入门书籍常见的冗长铺垫,而是直接将你带入到脚本世界的深水区。我特别欣赏作者在介绍复杂概念时所采用的那种近乎“手术刀式”的精确性,每一个命令的参数解析、管道的流动方向,都被剖析得一丝不苟。举个例子,当它讲解`awk`和`sed`的组合应用时,那种将文本流处理提升到艺术层面的描述,让我感觉自己不是在写脚本,而是在编织一个高效的数据处理流程。它不会告诉你“这个命令很有用”,而是会告诉你“在面对XXX复杂日志分析时,你需要用这个命令的YYY参数来达到ZZZ目的”,这种实战导向的讲解,远比那些空泛的理论更有价值。阅读过程中,我常常需要停下来,在真实的终端环境中反复试验书中的示例,才能真正领会其精髓。这本书的价值在于,它能让你从一个仅仅会使用Shell命令的操作者,蜕变为能够设计健壮、高效的自动化解决方案的架构师。它要求读者投入时间去消化,但回报是实实在在的生产力提升。
最让我感到惊喜的是,这本书对POSIX标准的遵循达到了近乎偏执的程度。在探讨不同Shell(如`bash`、`ksh`、`zsh`)的行为差异时,作者总是能清晰地指出,哪些特性是标准保证的,哪些是特定Shell的“方言”。这种对兼容性和可移植性的关注,对于需要跨平台维护或在受限环境中工作的工程师来说,简直是福音。它不是在教你如何写最酷炫的Bash脚本,而是在教你如何写一个能够在任何类UNIX系统上稳定运行的脚本。关于正则表达式的章节,更是将经典的工具与现代的编程思维融合得天衣无缝,它把那些复杂的匹配逻辑,拆解成一个个可以被逻辑推导的小模块。阅读过程中,我感觉作者在不断地提醒我:“代码的生命周期,远比你写完它的时候要长得多。”这本书的价值在于,它帮助我建立起了一种编写“面向未来”的Shell程序的习惯。
这本书给我的感觉是,它是一部对经典UNIX哲学进行了现代化诠释的著作。它的叙述风格非常沉稳、严谨,仿佛一位经验老道的系统架构师在娓娓道来他多年的经验总结。我尤其欣赏它在处理错误处理和系统健壮性方面的篇幅。很多Shell编程的书籍往往忽略了“当事情出错时该怎么办”这个关键问题,而这本书却花了大量篇幅来探讨如何优雅地捕获信号、如何进行资源清理以及如何构建可移植性强的脚本。这体现了作者对生产环境的深刻理解——在真实世界中,脚本的稳定性远比速度更重要。书中对`trap`机制的讲解,简直是教科书级别的典范,让我对如何编写在任何情况下都能保持数据完整性的程序有了全新的认识。阅读这本书的过程,与其说是学习语法,不如说是在接受一种严谨的编程思想熏陶,它教会你如何像操作系统本身一样思考问题,而不是仅仅依赖上层应用的抽象。
这本书的排版和逻辑组织,体现出一种非常古典的理工科书籍的风格:内容密集,信息密度极高。它没有使用花哨的图表或大量的彩色高亮来分散注意力,而是将所有的焦点都集中在代码和概念的精准表达上。我喜欢它在介绍复杂脚本设计模式时所展现出的条理清晰度,特别是关于函数库的封装和命名规范的部分。作者显然对如何构建一个可维护的大型Shell项目有着自己独到的见解,他强调的模块化和版本控制思想,即使在今天看来,也极具前瞻性。读完后我立刻着手重构了我司一套老旧的部署脚本,引入了书中建议的参数校验和日志分级系统,整个系统的健壮性得到了立竿见影的提升。这本书更像是一份严谨的工程规范,而不是一本轻松的编程读物,它要求你尊重每一个字符,因为它知道,在Shell的世界里,一个错误的引号或一个遗漏的`export`都可能引发灾难性的后果。