第Ⅰ部分 基本概念 3
第1章Unix、GNU和Linux的历史 3
1.1 Unix 3
1.1.1“一切皆文件”与管道 5
1.1.2 BSD 6
1.2 GNU 7
1.3 Linux 10
1.4本章小结 12
第2章 环境的搭建 13
2.1操作系统 13
2.1.1 GNU/Linux 13
2.1.2 BSD 15
2.1.3商业Unix 15
2.1.4 Microsoft Window 15
2.2编辑器 16
2.2.1图形化文本编辑器 16
2.2.2终端模拟器 19
2.2.3非图形化文本编辑器 19
2.3系统环境的搭建 21
2.3.1 shell配置文件 21
2.3.2别名 23
2.3.3 vim设置 27
2.4本章小结 28
第3章 变量 29
3.1使用变量 29
3.1.1类型 30
3.1.2变量的赋值 30
3.1.3位置参数 34
3.1.4返回码 38
3.1.5删除变量 41
3.2预定义变量和标准变量 42
3.2.1 BASH ENV 43
3.2.2 BASHOPTS 43
3.2.3 SHELLOPTS 44
3.2.4 BASH COMMAND 46
3.2.5 BASH SOURCE、FUNCNAME、LINENO和BASH LINENO 47
3.2.6 SHELL 51
3.2.7 HOSTNAME和HOSTTYPE 51
3.2.8工作目录 51
3.2.9 PIPESTATUS 51
3.2.10 TIMEFORMAT 52
3.2.11 PPID 53
3.2.12 RANDOM 54
3.2.13 REPLAY 54
3.2.14 SECONDS 55
3.2.15 BASH XTRACEFD 55
3.2.16 GLOBIGNORE 57
3.2.17 HOME 58
3.2.18 IFS 58
3.2.19 PATH 59
3.2.20 TMOUT 60
3.2.21 TMPDIR 61
3.2.22用户标识变量 61
3.3本章小结 62
第4章 通配符扩展 63
4.1文件名扩展(globbing) 63
4.1.1 bash的文件名扩展特性 66
4.1.2 shell选项 67
4.2正则表达式和引用 71
4.2.1正则表达式概述 72
4.2.2引用 73
4.3本章小结 77
第5章 条件执行 79
5.1 if/then 79
5.2 else 80
5.3 elif 81
5.4 test([) 83
5.4.1测试标志 84
5.4.2文件比较测试 91
5.4.3字符串比较测试 92
5.4.4正则表达式测试 94
5.4.5数值测试 97
5.4.6组合测试 98
5.5 case 101
5.6本章小结 105
第6章 使用循环进行流控制 107
6.1 for循环 107
6.1.1 for循环的使用时机 108
6.1.2向for提供数据 108
6.1.3 C风格的for循环 114
6.2 while循环 115
6.2.1 while循环的使用时机 116
6.2.2 while循环的用法 116
6.3嵌套循环 122
6.4循环的退出与继续 122
6.5带case的while循环 126
6.6 until循环 127
6.7 select循环 129
6.8本章小结 134
第7章 变量(续) 135
7.1变量的用法 135
7.1.1变量的类型 137
7.1.2变量的长度 138
7.1.3特殊字符串操作符 140
7.1.4按照长度剪裁变量字符串 141
7.1.5从字符串末尾剪裁 143
7.1.6使用模式剪裁字符串 143
7.2字符串查找 147
7.2.1查找与替换 147
7.2.2模式替换 149
7.2.3模式删除 149
7.2.4大小写转换 149
7.3提供默认值 150
7.4间接操作 153
7.5使用source命令加载变量 155
7.6本章小结 156
第8章 函数和库 157
8.1函数 157
8.1.1函数定义 157
8.1.2函数输出 158
8.1.3写入文件 160
8.1.4整个函数的输出重定向 163
8.1.5函数陷阱 167
8.1.6递归函数 168
8.2变量的作用域 173
8.3库 177
8.3.1库的创建与访问 179
8.3.2库的结构 179
8.3.3网络配置库 183
8.3.4库的使用 187
8.4 getopts 187
8.4.1错误处理 190
8.4.2函数中的getopts 191
8.5本章小结 194
第9章 数组 195
9.1数组的赋值 195
9.1.1一次一个 196
9.1.2一次全部 196
9.1.3按索引 197
9.1.4从源中一次全部读取 197
9.1.5从输入读取 199
9.2数组的访问 201
9.2.1用索引访问 201
9.2.2数组的长度 202
9.2.3用变量索引访问 203
9.2.4从数组中选择元素 205
9.2.5显示整个数组 206
9.3关联数组 206
9.4数组操作 207
9.4.1数组的复制 207
9.4.2向数组追加元素 209
9.4.3从数组中删除元素 211
9.5高级技术 212
9.6本章小结 213
第10章 进程 215
10.1 ps命令 215
10.1.1 ps显示的行宽 216
10.1.2精确分析进程表 217
10.2 killall 219
10.3 /proc虚拟文件系统 220
10.4 prtstat 221
10.5 I/O重定向 222
10.5.1向已有文件追加输出 224
10.5.2重定向的权限 225
10.6 exec 225
10.6.1使用exec替换已有程序 225
10.6.2使用exec修改重定向 226
10.7管道 233
10.8后台处理 233
10.8.1 wait命令 234
10.8.2使用nohup防止进程挂起 235
10.9 /proc和/sys的其他特性 238
10.9.1 /proc/version 238
10.9.2 SysRq 238
10.9.3 /proc/meminfo 240
10.9.4 /proc/cpuinfo 241
10.9.5 /sys 241
10.9.6 /sys/devices/system/node 248
10.9.7 sysctl 250
10.10本章小结 250
第11章shell的选择与使用 251
11.1 Bourne shell 251
11.2 Kornshell 252
11.3 C shell 252
11.4 Tenex C shell 252
11.5 Z shell 253
11.6 Bourne Again Shell 253
11.7 Debian Almquist Shell 253
11.8点文件 254
11.8.1交互式登录shell 255
11.8.2交互式非登录shell 256
11.8.3非交互式shell 257
11.8.4登出脚本 257
11.9命令提示符 257
11.9.1 PS1提示符 257
11.9.2 PS2、 PS3和PS4提示符 259
11.10别名 260
11.10.1节省时间 260
11.10.2修改行为 261
11.11 history命令 262
11.11.1回调命令 262
11.11.2搜索历史 263
11.11.3时间戳 263
11.12 Tab补全 265
11.12.1 ksh 265
11.12.2 tcsh 266
11.12.3 zsh 266
11.12.4 bash 267
11.13后台、前台与作业控制 268
11.13.1后台进程 268
11.13.2作业控制 268
11.13.3 nohup和disown 271
11.14本章小结 272
第Ⅱ部分 系统工具使用与扩展诀窍 275
第12章 文件操作 275
12.1 stat 275
12.2 cat 277
12.2.1行号标记 277
12.2.2处理空白行 278
12.2.3非打印字符 279
12.3 cat的反转词tac 280
12.4重定向 281
12.4.1重定向输出:单个大于符号(>) 281
12.4.2追加:双大于符号(>>) 282
12.4.3输入重定向:单个小于符号(<) 284
12.4.4 here文档:双小于符号(<<FOF) 286
12.5 dd 289
12.6 df 291
12.7 mktemp 292
12.8 join 293
12.9 install 294
12.10 grep 296
12.10.1 grep标志 297
12.10.2 grep正则表达式 298
12.11 split 299
12.12 tee 301
12.13 touch 302
12.14 find 303
12.15 find -exec 306
12.16本章小结 310
第13章 文本操作 311
13.1 cut 311
13.2 echo 312
13.2.1 diall脚本 312
13.2.2 dia12脚本 315
13.3 fmt 316
13.4 head和tail 319
13.4.1奖牌脚本 319
13.4.2世界杯脚本 320
13.5 od 324
13.6 paste 328
13.7 pr 331
13.8 printf 332
13.9 shuf 334
13.9.1掷骰子 334
13.9.2发牌 335
13.9.3旅行线路 336
13.10 sort 338
13.10.1按照键进行排序 338
13.10.2按照日期与时间对日志文件排序 340
13.10.3对人类可读的数值进行排序 342
13.11tr 343
13.12 uniq 346
13.13 wc 348
13.14本章小结 349
第14章 系统管理工具 351
14.1 basename 351
14.2 date 353
14.2.1 date的典型用法 353
14.2.2 date的一些更有趣的用法 357
14.3 dimame 358
14.4 factor 360
14.5 id、 groups与getent 362
14.6 logger 365
14.7 md5sum 366
14.8 mkfifo 368
14.8.1主与从 369
14.8.2颠倒顺序 371
14.9联网 373
14.9.1 telnet 373
14.9.2 netcat 374
14.9.3 ping 376
14.9.4编写ssh与scp脚本 378
14.9.5 OpenSSL 381
14.10 nohup 387
14.11 seq 388
14.11.1整数序列 389
14.11.2浮点数序列 391
14.12 sleep 391
14.13 timeout 392
14.13.1关闭脚本 394
14.13.2网络超时 396
14.14 uname 398
14.15 uuencode 399
14.16 xargs 400
14.17 yes 403
14.18本章小结 404
第Ⅲ部分 系统管理的实用脚本 407
第15章shell特性 407
15.1实用脚本15-1:安装 407
初始化脚本 407
15.1.1用到的技术 407
15.1.2概念 408
15.1.3潜在的陷阱 408
15.1.4脚本结构 408
15.1.5脚本代码 410
15.1.6调用结果 411
15.1.7小结 412
15.2实用脚本15-2: RPM报告 412
15.2.1用到的技术 412
15.2.2概念 412
15.2.3潜在的陷阱 413
15.2.4脚本结构 413
15.2.5脚本代码 414
15.2.6调用结果 417
15.2.7小结 418
15.3实用脚本15-3:postinstall脚本 418
15.3.1用到的技术 418
15.3.2概念 419
15.3.3潜在的陷阱 419
15.3.4脚本结构 420
15.3.5脚本代码 421
15.3.6调用结果 423
15.3.7小结 423
第16章 系统管理 425
16.1实用脚本16-1:初始化脚本 425
16.1.1用到的技术 426
16.1.2概念 426
16.1.3潜在的陷阱 427
16.1.4脚本结构 428
16.1.5脚本代码 429
16.1.6调用结果 430
16.1.7小结 431
16.2实用脚本16-2: CGI脚本 431
16.2.1用到的技术 431
16.2.2概念 431
16.2.3潜在的陷阱 432
16.2.4脚本结构 433
16.2.5脚本代码 436
16.2.6调用结果 439
16.2.7小结 442
16.3实用脚本16-3:配置文件 443
16.3.1用到的技术 443
16.3.2概念 443
16.3.3潜在的陷阱 443
16.3.4脚本结构 443
16.3.5脚本代码 444
16.3.6调用结果 445
16.3.7小结 445
16.4实用脚本16-4:锁 445
16.4.1用到的技术 446
16.4.2概念 446
16.4.3潜在的陷阱 446
16.4.4脚本结构 448
16.4.5脚本代码 450
16.4.6调用结果 452
16.4.7小结 455
第17章 演示 457
17.1实用脚本17-1:太空游戏 457
17.1.1用到的技术 457
17.1.2概念 457
17.1.3潜在的陷阱 460
17.1.4脚本结构 460
17.1.5脚本代码 461
17.1.6调用结果 466
17.1.7小结 468
第18章 数据存储与检索 469
18.1实用脚本18-1:分析HTML 469
18.1.1用到的技术 469
18.1.2概念 469
18.1.3潜在的陷阱 470
18.1.4脚本结构 470
18.1.5脚本代码 471
18.1.6调用结果 472
18.1.7小结 474
18.2实用脚本18-2: CSV格式化 474
18.2.1用到的技术 474
18.2.2概念 475
18.2.3潜在的陷阱 475
18.2.4脚本结构 475
18.2.5脚本代码 477
18.2.6调用结果 479
18.2.7小结 480
第19章 数值 481
19.1实用脚本19-1:斐波那契数列 481
19.1.1用到的技术 481
19.1.2概念 482
19.1.3潜在的陷阱 482
19.1.4方法一的结构 483
19.1.5方法一的脚本 483
19.1.6方法一的调用结果 484
19.1.7方法二的结构 484
19.1.8方法二的脚本 485
19.1.9方法二的调用结果 486
19.1.10方法三的结构 487
19.1.11方法三的脚本 488
19.1.12方法三的调用结果 488
19.1.13小结 490
19.2实用脚本19-2: PXE启动 490
19.2.1用到的技术 490
19.2.2概念 490
19.2.3潜在的陷阱 491
19.2.4脚本结构 491
19.2.5脚本代码 492
19.2.6调用结果 495
19.2.7小结 497
第20章 进程 499
20.1实用脚本20-1:进程控制 499
20.1.1用到的技术 499
20.1.2概念 499
20.1.3潜在的陷阱 501
20.1.4脚本结构 501
20.1.5脚本代码 503
20.1.6调用结果 509
20.1.7小结 514
第21章 国际化 515
21.1实用脚本21-1:国际化 515
21.1.1用到的技术 516
21.1.2概念 516
21.1.3潜在的陷阱 517
21.1.4脚本结构 518
21.1.5脚本代码 518
21.1.6调用结果 522
21.1.7小结 524
第Ⅳ部分 参考信息 527
附录 补充材料 527
术语表 531