第1章 UNIX/Linux shell简介 1
1.1 UNIX与Linux及其历史 1
1.1.1 UNIX简介 1
1.1.2 为什么选择Linux 2
1.2 shell的定义与功能 3
1.2.1 UNIX shell 4
1.2.2 Linux的shell 4
1.3 shell的历史 6
1.3.1 shell的作用 7
1.3.2 shell的职责 7
1.4 系统启动与登录shell 7
1.4.1 解析命令行 8
1.4.2 命令类型 8
1.5 进程与shell 10
1.5.1 哪些进程正在运行? 10
1.5.2 系统调用 11
1.5.3 创建进程 12
1.6 环境与继承 15
1.6.1 所有权 15
1.6.2 为文件创建掩码 15
1.6.3 修改权限与所有者 16
1.6.4 工作目录 18
1.6.5 变量 19
1.6.6 重定向与管道 20
1.6.7 shell和信号 25
1.7 在脚本中执行命令 26
第2章 shell编程快速入门 27
2.1 shell脚本简介 27
2.2 脚本实例:主要shell的比较 27
2.2.1 开始之前 27
2.2.2 示例说明 28
2.3 C shell与TC shell的语法和
结构 28
2.4 Bourne shell的语法和结构 34
2.5 Korn shell结构 41
2.6 Bash shell结构 49
第3章 正则表达式与模式匹配 57
3.1 正则表达式 57
3.1.1 定义和示例 57
3.1.2 正则表达式元字符 58
3.2 组合正则表达式元字符 63
第4章 grep家族 69
4.1 grep命令 69
4.1.1 grep的含义 69
4.1.2 grep如何工作 70
4.1.3 元字符 70
4.1.4 grep的退出状态 72
4.2 使用正则表达式的grep实例 72
4.3 grep的选项 77
4.4 grep与管道 79
4.5 egrep(扩展的grep) 80
4.5.1 egrep示例 81
4.5.2 egrep回顾 83
4.6 fgrep(固定的grep或
快速的grep) 83
4.7 Linux与GNU grep 84
4.8 带正则表达式的GNU
基本grep(grep -G) 87
4.9 grep –E或egrep
(GNU扩展grep) 88
4.9.1 grep –E和egrep实例 89
4.9.2 grep变体的不规则形式 92
4.10 固定的grep(grep –F和fgrep) 95
4.11 递归的grep(rgrep,grep -R) 95
4.12 带选项的GNU grep 95
4.13 带选项的grep
(UNIX和GNU) 97
第5章 流编辑器sed 105
5.1 sed简介 105
5.2 sed的不同版本 105
5.3 sed的工作过程 106
5.4 正则表达式 106
5.5 定址 107
5.6 命令与选项 108
5.6.1 用sed修改文件 109
5.6.2 GNU sed的选项 109
5.7 报错信息和退出状态 110
5.8 元字符 110
5.9 sed范例 111
5.9.1 打印:p命令 112
5.9.2 删除:d命令 113
5.9.3 替换:s命令 114
5.9.4 指定行的范围:逗号 116
5.9.5 多重编辑:e命令 117
5.9.6 读文件:r命令 118
5.9.7 写文件:w命令 119
5.9.8 追加:a命令 119
5.9.9 插入:i命令 120
5.9.10 修改:c命令 121
5.9.11 获取下一行:n命令 121
5.9.12 转换:y命令 122
5.9.13 退出:q命令 122
5.9.14 暂存和取用:h命令
和g命令 123
5.9.15 暂存和互换:h命令
和x命令 126
5.10 sed脚本编程 126
5.10.1 sed脚本范例 127
5.10.2 回顾 129
第6章 awk实用程序 131
6.1 什么是awk、nawk、gawk 131
6.1.1 awk简介 131
6.1.2 awk版本 131
6.2 awk的格式 132
6.2.1 从文件输入 132
6.2.2 从命令输入 133
6.3 awk工作原理 134
6.4 格式化输出 135
6.4.1 print函数 135
6.4.2 OFMT变量 136
6.4.3 printf函数 136
6.5 文件中的awk命令 139
6.6 记录与字段 140
6.6.1 记录 140
6.6.2 字段 141
6.6.3 字段分隔符 141
6.7 模式与操作 143
6.7.1 模式 143
6.7.2 操作 144
6.8 正则表达式 145
6.8.1 匹配整行 146
6.8.2 匹配操作符 146
6.9 脚本文件中的awk命令 148
6.10 复习 149
6.10.1 简单的模式匹配 149
6.10.2 简单的操作 150
6.10.3 模式与操作组合的
正则表达式 152
6.10.4 输入字段分隔符 154
6.10.5 编写awk脚本 156
6.11 比较表达式 157
6.11.1 关系运算符 158
6.11.2 条件表达式 159
6.11.3 算术运算 159
6.11.4 逻辑操作符和复合模式 160
6.11.5 范围模式 161
6.11.6 验证数据合法性 161
6.12 复习 162
6.12.1 相等性测试 163
6.12.2 关系运算符 164
6.12.3 逻辑运算符 165
6.12.4 逻辑非运算符 165
6.12.5 算术运算符 166
6.12.6 范围运算符 168
6.12.7 条件运算符 168
6.12.8 赋值运算符 169
6.13 变量 170
6.13.1 数值变量和字符串变量 170
6.13.2 用户自定义变量 171
6.13.3 BEGIN模式 174
6.13.4 END模式 175
6.14 重定向和管道 175
6.14.1 输出重定向 175
6.14.2 输入重定向(getline) 175
6.15 管道 177
6.16 回顾 179
6.16.1 递增和递减运算符 179
6.16.2 内置变量 180
6.16.3 BEGIN模式 183
6.16.4 END模式 184
6.16.5 包含BEGIN和END
模式的awk脚本 185
6.16.6 printf函数 186
6.16.7 重定向与管道 187
6.16.8 打开和关闭管道 188
6.17 条件语句 190
6.17.1 if语句 190
6.17.2 if/else语句 190
6.17.3 if/else和else if语句 191
6.18 循环 192
6.18.1 while循环 192
6.18.2 for循环 193
6.18.3 循环控制 193
6.19 程序控制语句 194
6.19.1 next语句 194
6.19.2 exit语句 194
6.20 数组 194
6.20.1 关联数组的下标 195
6.20.2 处理命令行参数(nawk) 200
6.21 awk的内置函数 202
6.22 内置算术函数 205
6.22.1 整数函数 205
6.22.2 随机数发生器 206
6.23 用户自定义函数(nawk) 207
6.24 复习 208
6.25 杂项 213
6.25.1 固定字段 214
6.25.2 多行记录 216
6.25.3 生成格式信函 217
6.25.4 与shell交互 219
6.26 awk内置函数 221
6.26.1 字符串函数 221
6.26.2 gawk的时间函数 224
6.26.3 命令行参数 226
6.26.4 读输入(getline) 227
6.26.5 控制函数 228
6.26.6 用户自定义函数 229
6.26.7 awk/gawk命令行选项 229
第7章 交互式的Bourne shell 233
7.1 简介 233
7.2 环境 234
7.2.1 初始化文件 234
7.2.2 提示符 237
7.2.3 搜索路径 238
7.2.4 hash命令 238
7.2.5 dot命令 239
7.3 命令行 239
7.3.1 退出状态 240
7.3.2 含多条命令的命令行 240
7.3.3 命令的条件执行 241
7.3.4 在后台执行的命令 241
7.4 元字符(通配符) 242
7.5 文件名替换 242
7.5.1 星号 243
7.5.2 问号 243
7.5.3 方括号 244
7.5.4 转义元字符 244
7.6 变量 245
7.6.1 局部变量 245
7.6.2 设置局部变量 245
7.6.3 环境变量 247
7.6.4 列出已设置的变量 248
7.6.5 复位变量 249
7.6.6 打印变量的值:echo命令 250
7.6.7 变量扩展修饰符 251
7.6.8 位置参数 253
7.6.9 其他特殊变量 254
7.7 引用 255
7.7.1 反斜杠 256
7.7.2 单引号 256
7.7.3 双引号 257
7.8 命令替换 257
7.9 函数入门 258
7.9.1 定义函数 258
7.9.2 列出和复位函数 259
7.10 标准I/O和重定向 259
7.11 管道 264
7.12 here文档与重定向输入 265
第8章 Bourne shell编程 269
8.1 简介 269
8.2 读取用户输入 271
8.3 算术运算 272
8.3.1 整数运算与expr命令 273
8.3.2 浮点运算 273
8.4 位置参量和命令行参数 274
8.4.1 set命令与位置参量 275
8.4.2 $*和$@有何区别 277
8.5 条件结构和流控制 278
8.5.1 测试退出状态:test命令 279
8.5.2 if命令 280
8.5.3 exit命令和?变量 282
8.5.4 检查空值 283
8.5.5 if/else命令 284
8.5.6 if/elif/else命令 285
8.5.7 文件测试 287
8.5.8 null命令 287
8.5.9 case命令 289
8.5.10 用here文档和case
命令生成菜单 290
8.6 循环命令 291
8.6.1 for命令 291
8.6.2 词表中的$*和$@变量 293
8.6.3 while命令 295
8.6.4 until命令 297
8.6.5 循环控制命令 298
8.6.6 嵌套循环和循环控制 302
8.6.7 I/O重定向和子shell 304
8.6.8 在后台执行循环 306
8.6.9 exec命令和循环 307
8.6.10 IFS和循环 308
8.7 函数 309
8.7.1 清除函数 310
8.7.2 函数的参数和返回值 310
8.7.3 函数与dot命令 312
8.8 捕获信号 314
8.8.1 重置信号 315
8.8.2 忽略信号 316
8.8.3 列出陷阱 316
8.8.4 函数中的信号陷阱 317
8.8.5 调试 318
8.9 命令行 319
8.9.1 用getopts处理命令行选项 319
8.9.2 eval命令和命令行解析 324
8.10 shell的调用选项 325
8.10.1 set命令和选项 326
8.10.2 shell的内置命令 326
第9章 交互式C shell与TC shell 335
9.1 简介 335
9.2 环境 336
9.2.1 初始化文件 336
9.2.2 搜索路径 338
9.2.3 rehash命令 339
9.2.4 hashstat命令 339
9.2.5 source命令 339
9.2.6 shell提示符 340
9.3 C/TC shell命令行 341
9.3.1 退出状态 341
9.3.2 命令编组 341
9.3.3 命令的条件执行 342
9.3.4 后台命令 343
9.3.5 命令行历史 343
9.4 别名 347
9.4.1 列出别名 347
9.4.2 创建别名 348
9.4.3 删除别名 348
9.4.4 别名环 349
9.5 操作目录栈 349
9.6 作业控制 351
9.6.1 &号和后台作业 351
9.6.2 暂停键序列和后台作业 352
9.6.3 jobs命令 352
9.6.4 前台和后台命令 353
9.7 shell元字符 353
9.8 文件名替换 354
9.8.1 星号 355
9.8.2 问号 355
9.8.3 方括号 356
9.8.4 花括号 356
9.8.5 转义元字符 357
9.8.6 ~号扩展 357
9.8.7 文件名补全:变量filec 358
9.8.8 用noglob关闭元字符 358
9.9 重定向与管道 359
9.9.1 重定向输入 359
9.9.2 here文档 360
9.9.3 重定向输出 361
9.9.4 将输出追加到已有文件 362
9.9.5 重定向输出和报错信息 362
9.9.6 分离输出与报错信息 363
9.9.7 变量noclobber 364
9.10 变量 365
9.10.1 花括号 366
9.10.2 局部变量 366
9.10.3 环境变量 369
9.10.4 数组 371
9.10.5 专用变量 373
9.11 命令替换 375
9.12 引用 377
9.12.1 反斜杠 378
9.12.2 单引号 378
9.12.3 双引号 379
9.12.4 引用的游戏 379
9.13 交互式TC shell的新特性 381
9.13.1 tcsh的版本 382
9.13.2 shell提示符 382
9.14 TC shell命令行 385
9.14.1 命令行与退出状态 385
9.14.2 TC shell命令行历史 386
9.14.3 内置命令行编辑器 393
9.15 TC shell命令、文件名
与变量补齐 399
9.15.1 autolist变量 399
9.15.2 fignore变量 400
9.15.3 shell变量complete 401
9.15.4 编程补全 401
9.16 TC shell拼写校正 405
9.17 TC shell别名 406
9.17.1 列出别名 406
9.17.2 创建别名 407
9.17.3 删除别名 408
9.17.4 别名循环 408
9.17.5 特殊的tcsh别名 408
9.18 TC shell作业控制 409
9.18.1 jobs命令与listjobs变量 409
9.18.2 前台与后台命令 410
9.18.3 作业调度 411
9.19 在TC shell中显示变量的值 412
9.19.1 echo命令 412
9.19.2 printf命令 413
9.19.3 花括号与变量 414
9.19.4 大小写转换 415
9.20 TC shell内置命令 416
9.20.1 特殊的内置T/TC
shell变量 424
9.20.2 TC shell命令行开关 429
第10章 C shell与TC shell编程 433
10.1 简介 433
10.2 读取用户输入 435
10.2.1 变量$< 435
10.2.2 根据输入的字符串
创建词表 436
10.3 算术运算 436
10.3.1 算术运算符 436
10.3.2 浮点算术运算 438
10.4 脚本调试 438
10.5 命令行参数 440
10.6 条件结构与流控制 442
10.6.1 测试表达式 442
10.6.2 优先级和组合规则 443
10.6.3 if语句 444
10.6.4 测试未设置或值为
空的变量 445
10.6.5 if/else语句 445
10.6.6 逻辑表达式 446
10.6.7 if语句和单条命令 447
10.6.8 if/else if语句 447
10.6.9 退出状态和变量status 448
10.6.10 从shell脚本中退出 448
10.6.11 使用别名创建
错误信息 449
10.6.12 在脚本中使用变量
status 450
10.6.13 在条件结构中对
命令求值 450
10.6.14 goto命令 451
10.6.15 C shell文件测试 452
10.6.16 test命令与文件测试 453
10.6.17 条件结构的嵌套 454
10.6.18 TC shell文件测试 455
10.6.19 内置命令filetest(tcsh) 456
10.6.20 新增的TC shell文件
测试操作 457
10.6.21 switch命令 459
10.6.22 here文档和菜单 461
10.7 循环命令 463
10.7.1 foreach循环 463
10.7.2 while循环 465
10.7.3 repeat命令 466
10.7.4 循环控制命令 466
10.8 中断处理 470
10.9 setuid脚本 471
10.10 保存脚本 471
10.11 内置命令 472
第11章 交互式Korn shell 481
11.1 简介 481
11.2 环境 482
11.2.1 初始化文件 482
11.2.2 提示符 486
11.2.3 搜索路径 487
11.2.4 句点命令 487
11.3 命令行 488
11.3.1 命令执行的次序 488
11.3.2 退出状态 489
11.3.3 含多条命令的命令行
和命令组 490
11.3.4 命令的条件执行 490
11.3.5 后台执行的命令 490
11.3.6 命令行历史 491
11.3.7 命令行编辑 494
11.4 文件名扩展 497
11.5 别名 497
11.5.1 别名列表 498
11.5.2 创建别名 499
11.5.3 删除别名 499
11.5.4 别名定位 499
11.6 作业控制 500
11.7 元字符 501
11.8 文件名替换(通配符) 502
11.8.1 星号 503
11.8.2 问号 503
11.8.3 方括号 504
11.8.4 转义元字符 505
11.8.5 代字符号和连字符扩展 505
11.8.6 新增的ksh元字符 506
11.8.7 noglob变量 507
11.9 变量 507
11.9.1 局部变量 507
11.9.2 环境变量 509
11.9.3 列出已设置的变量 512
11.9.4 复位变量 514
11.9.5 显示变量的值 514
11.9.6 转义序列 516
11.9.7 变量表达式和扩
展修饰符 517
11.9.8 变量子字符串扩展 519
11.9.9 变量属性:typeset命令 520
11.9.10 位置参数 521
11.9.11 其他特殊变量 523
11.10 引用 524
11.10.1 反斜杠 524
11.10.2 单引号 524
11.10.3 双引号 525
11.11 命令替换 525
11.12 函数 527
11.12.1 函数的定义 527
11.12.2 函数和别名 528
11.12.3 列出函数 529
11.12.4 取消函数的定义 529
11.13 标准I/O和重定向 530
11.13.1 exec命令和重定向 531
11.13.2 重定向与子shell 532
11.14 管道 533
11.15 time命令 535
11.15.1 time命令 535
11.15.2 TMOUT变量 536
第12章 Korn shell编程 537
12.1 简介 537
12.2 读取用户输入 539
12.2.1 read命令和文件描述符 541
12.2.2 从整个文件中读取数据 542
12.3 算术运算 542
12.3.1 整型数值 543
12.3.2 使用不同的基数 544
12.3.3 列出所有整型变量 544
12.3.4 算术运算符和let命令 545
12.4 位置参量和命令行参数 547
12.5 分支结构和流程控制 549
12.5.1 测试退出状态和$?变量 550
12.5.2 老的test命令 551
12.5.3 新的test命令 552
12.5.4 带有二元操作符的
文件测试 553
12.5.5 逻辑操作符 553
12.5.6 文件测试 554
12.5.7 if命令 555
12.5.8 使用老式风格的
Bourne test 556
12.5.9 使用新式风格的
Korn test 557
12.5.10 使用旧式风格的带数字
表达式的Bourne test 557
12.5.11 let命令和数字测试 557
12.5.12 if/else命令 558
12.5.13 if/elif/else命令 559
12.5.14 exit命令 560
12.5.15 null命令 561
12.5.16 case命令 562
12.6 循环命令 564
12.6.1 for命令 564
12.6.2 词表中的变量$*和$@ 566
12.6.3 while 命令 567
12.6.4 until命令 569
12.6.5 select命令和菜单 570
12.6.6 循环控制命令 573
12.6.7 嵌套循环和循环控制 576
12.6.8 I/O 重定向和循环 577
12.6.9 在后台运行循环 578
12.6.10 exec命令和循环 579
12.6.11 IFS和循环 580
12.7 数组 581
12.8 函数 583
12.8.1 定义函数 583
12.8.2 列出和取消函数定义 584
12.8.3 局部变量和返回值 584
12.8.4 导出函数 586
12.8.5 typeset命令和函数选项 587
12.9 trap命令 588
12.9.1 伪信号 589
12.9.2 复位信号 589
12.9.3 忽略信号 590
12.9.4 列出信号 590
12.9.5 陷入和函数 592
12.10 协作进程 593
12.11 调试 596
12.12 命令行 598
12.13 安全性 603
12.13.1 特权脚本 603
12.13.2 受限shell 603
12.14 内置命令 603
12.15 Korn shell调用参数 607
第13章 交互式bash shell 619
13.1 简介 619
13.1.1 bash版本 619
13.1.2 启动 620
13.2 环境 621
13.2.1 初始化文件 621
13.2.2 用内置的set和shopt
命令设置bash选项 629
13.2.3 提示符 632
13.2.4 搜索路径 634
13.2.5 hash命令 634
13.2.6 source或dot命令 635
13.3 命令行 636
13.3.1 处理命令的顺序 636
13.3.2 内置命令和help命令 637
13.3.3 改变命令行处理的顺序 637
13.3.4 退出状态 638
13.3.5 含多条命令的命令行 639
13.3.6 命令编组 640
13.3.7 命令的条件执行 640
13.3.8 在后台执行的命令 640
13.4 作业控制 641
13.5 命令行快捷方式 643
13.5.1 命令和文件名补全 643
13.5.2 历史 644
13.5.3 从历史文件访问命令 644
13.5.4 命令行编辑 650
13.6 别名 654
13.6.1 列出别名 654
13.6.2 创建别名 654
13.6.3 删除别名 655
13.7 操作目录栈 655
13.7.1 内置命令dirs 655
13.7.2 pushd命令和popd命令 655
13.8 元字符(通配符) 657
13.9 文件名替换(globbing) 657
13.9.1 星号 658
13.9.2 问号 658
13.9.3 方括号 659
13.9.4 花括号 659
13.9.5 转义元字符 660
13.9.6 代字符号和连字符扩展 661
13.9.7 控制通配符(globbing) 661
13.9.8 扩展的文件名globbing
(bash 2.x) 662
13.10 变量 663
13.10.1 变量类型 663
13.10.2 命名惯例 663
13.10.3 内置命令declare 664
13.10.4 局部变量和作用域 664
13.10.5 环境变量 666
13.10.6 复位变量 671
13.10.7 显示变量值 671
13.10.8 变量扩展修饰符 673
13.10.9 子串的变量扩展 676
13.10.10 位置参量 678
13.10.11 其他特殊变量 679
13.11 引用 680
13.11.1 反斜杠 680
13.11.2 单引号 681
13.11.3 双引号 682
13.12 命令替换 682
13.13 算术扩展 685
13.14 扩展顺序 685
13.15 数组 685
13.16 函数 687
13.16.1 定义函数 688
13.16.2 列出和清除函数 690
13.17 标准I/O和重定向 690
13.18 管道 694
13.19 shell调用选项 697
13.19.1 set命令和选项 697
13.19.2 shopt命令和选项 699
13.20 shell内置命令 700
第14章 bash shell编程 705
14.1 简介 705
14.2 读取用户输入 707
14.2.1 变量 707
14.2.2 read命令 707
14.3 算术运算 710
14.3.1 整数运算(declare
和let命令) 710
14.3.2 浮点数运算 712
14.4 位置参量和命令行参数 712
14.4.1 位置参量 712
14.4.2 set命令与位置参量 714
14.5 条件结构和流程控制 717
14.5.1 退出状态 717
14.5.2 内置命令test与let 717
14.5.3 if命令 722
14.5.4 if/else命令 726
14.5.5 if/elif/else命令 727
14.5.6 文件测试 729
14.5.7 null命令 731
14.5.8 case命令 733
14.6 循环命令 735
14.6.1 for命令 735
14.6.2 词表中的$*和@变量 737
14.6.3 while命令 738
14.6.4 until命令 741
14.6.5 select命令和菜单 742
14.6.6 循环控制命令 746
14.6.7 I/O重定向与子shell 752
14.6.8 在后台执行循环 754
14.6.9 IFS和循环 754
14.7 函数 755
14.7.1 清除函数 756
14.7.2 导出函数 756
14.7.3 函数的参数和返回值 756
14.7.4 函数与source
(或dot)命令 759
14.8 捕获信号 762
14.8.1 重置信号 763
14.8.2 忽略信号 764
14.8.3 列出陷阱 764
14.8.4 函数中的信号陷阱 765
14.9 调试 766
14.10 命令行 768
14.10.1 用getopts处理命令
行选项 768
14.10.2 eval命令和命令行
解析 773
14.11 bash的选项 774
14.11.1 shell调用选项 774
14.11.2 set命令及其选项 775
14.11.3 shopt命令及其选项 776
14.12 shell的内置命令 778
14.13 bash shell的习题 780
第15章 调试shell脚本 787
15.1 简介 787
15.2 风格问题 787
15.3 错误类型 788
15.3.1 运行时错误 788
15.3.2 命名惯例 788
15.3.3 参数不足 789
15.3.4 路径问题 790
15.3.5 shbang行 791
15.3.6 别名问题 792
15.4 可能导致语法错误的原因 793
15.4.1 未定义变量与误写变量 793
15.4.2 未完成的编程语句 795
15.4.3 5种shell中常见的
错误信息 806
15.4.4 逻辑错误与健壮性 814
15.5 使用shell选项与set命令
进行跟踪 821
15.5.1 调试Bourne shell脚本 821
15.5.2 调试C/TC shell脚本 822
15.5.3 调试Korn shell脚本 825
15.5.4 调试bash脚本 827
15.6 小结 830
第16章 系统管理员与shell 831
16.1 简介 831
16.2 超级用户 831
16.3 使用su命令变为超级用户 832
16.3.1 以根用户身份运行脚本 834
16.3.2 以root身份运行的
脚本(setuid程序) 835
16.4 引导脚本 837
16.4.1 相关术语 837
16.4.2 一个引导脚本的例子
—— cron工具 841
16.4.3 编写一个可移植的脚本 845
16.4.4 用户指定初始化文件 848
16.4.5 系统范围内的初始化
文件 849
16.5 小结 855
附录A 常用的UNIX/Linux实用程序 857
附录B 各种shell的比较 899