序 1
前言 3
第1章 背景知识 15
1.1 UNIX简史 15
1.2 软件工具的原则 18
1.3 小结 20
第2章 入门 22
2.1 脚本编程语言与编译型语言的差异 22
2.2 为什么要使用Shell脚本 23
2.3 一个简单的脚本 23
2.4 自给自足的脚本:位于第一行的#! 24
2.5 Shell的基本元素 26
2.6 访问Shell脚本的参数 37
2.7 简单的执行跟踪 38
2.8 国际化与本地化 39
2.9 小结 42
第3章 查找与替换 44
3.1 查找文本 44
3.2 正则表达式 45
3.3 字段处理 70
3.4 小结 79
第4章 文本处理工具 81
4.1 排序文本 81
4.2 删除重复 89
4.3 重新格式化段落 90
4.4 计算行数、字数以及字符数 92
4.5 打印 93
4.6 提取开头或结尾数行 98
4.7 小结 100
第5章 管道的神奇魔力 101
5.1 从结构化文本文件中提取数据 101
5.2 针对Web的结构型数据 108
5.3 文字解谜好帮手 114
5.4 单词列表 116
5.5 标签列表 119
5.6 小结 121
第6章 变量、判断、重复动作 123
6.1 变量与算术 123
6.2 退出状态 134
6.3 case语句 143
6.4 循环 144
6.5 函数 150
6.6 小结 153
第7章 输入/输出、文件与命令执行 154
7.1 标准输入、标准输出与标准错误输出 154
7.2 使用read读取行 154
7.3 关于重定向 157
7.4 printf的完整介绍 161
7.5 波浪号展开与通配符 166
7.6 命令替换 170
7.7 引用 176
7.8 执行顺序与eval 177
7.9 内建命令 183
7.10 小结 190
第8章 产生脚本 192
8.1 路径查找 192
8.2 软件构建自动化 207
8.3 小结 236
第9章 awk的惊人表现 237
9.1 awk命令行 238
9.2 awk程序模型 239
9.3 程序元素 240
9.4 记录与字段 250
9.5 模式与操作 252
9.6 在awk里的单行程序 254
9.7 语句 257
9.8 用户定义函数 266
9.9 字符串函数 269
9.10 数值函数 277
9.11 小结 279
第10章 文件处理 280
10.1 列出文件 280
10.2 使用touch更新修改时间 286
10.3 临时性文件的建立与使用 287
10.4 寻找文件 291
10.5 执行命令:xargs 306
10.6 文件系统的空间信息 308
10.7 比较文件 312
10.8 小结 320
第11章 文件处理 280
11.1 问题描述 322
11.2 密码文件 323
11.3 合并密码文件 324
11.4 改变文件所有权 331
11.5 其他真实世界的议题 335
11.6 小结 336
第12章 拼写检查 338
12.1 spell程序 338
12.2 最初的UNIX拼写检查原型 339
12.3 改良的ispell与aspell 340
12.4 在awk内的拼写检查程序 343
12.5 小结 362
第13章 进程 363
13.1 进程建立 364
13.2 进程列表 365
13.3 进程控制与删除 371
13.4 进程系统调用的追踪 378
13.5 进程账 382
13.6 延迟的进程调度 383
13.7 /proc文件系统 388
13.8 小结 390
第14章 Shell可移植性议题与扩展 391
14.1 迷思 391
14.2 bash的shopt命令 395
14.3 共通的扩展 399
14.4 下载信息 412
14.5 其他扩展的Bourne式Shell 415
14.6 Shell版本 416
14.7 Shell初始化与终止 416
14.8 小结 422
第15章 安全的Shell脚本:起点 424
15.1 安全性Shell脚本提示 424
15.2 限制性Shell 427
15.3 特洛伊木马 429
15.4 为Shell脚本设置setuid:坏主意 430
15.5 ksh93与特权模式 431
15.6 小结 432
附录A 编写手册页 435
附录B 文件与文件系统 449
附录C 重要的UNIX命令 483
参考书目 488