目录 1
第一部分 UNIX和Shell工具简介 1
第1学 时Shell基础 1
1.1 什么是命令 1
1.1.1 简单命令 2
1.1.2 复杂命令 2
1.1.3 复合命令 3
1.1.4 命令分隔符 3
1.2 什么是Shell 4
1.2.1 Shell提示符 4
1.2.2 Shell的类型 5
1.3 小结 8
1.4 问题 8
1.5 术语 8
第2学 时脚本基础 10
2.1 UNIX系统 10
2.2 Shell初始化 11
2.2.1 交互和非交互Shell 12
2.2.2 初始化文件的内容 13
2.2.3 使Shell脚本可执行 14
2.3.1 使用man命令 15
2.3 获取帮助 15
2.3.2 指南部分划分 16
2.4 小结 17
2.5 问题 17
2.6 术语 17
第3学 时文件操作 19
3.1 列文件名 19
3.1.1 隐藏文件 20
3.2 浏览文件内容 21
3.2.1 cat 21
3.1.2 选项组合 21
3.2.2 统计单词(wc) 22
3.3 操作文件 24
3.3.1 拷贝文件(cp) 24
3.3.2 重命名文件(mv) 25
3.3.3 删除文件(rm) 26
3.4 小结 26
3.5 问题 27
3.6 术语 27
4.1.1 文件名 28
第4学 时目录操作 28
4.1 目录树 28
4.1.2 路径名 29
4.2 改变目录 31
4.2.1 起始目录 31
4.2.2 改变目录 31
4.3 列文件和目录 32
4.3.1 列目录 32
4.3.2 列文件 33
4.4.1 创建目录 34
4.4 操作目录 34
4.4.2 拷贝文件和目录 35
4.4.3 移动文件和目录 36
4.4.4 删除目录 37
4.5 小结 38
4.6 问题 38
第5学 时文件属性操作 40
5.1 文件类型 40
5.1.1 判断文件类型 40
5.1.3 符号链 41
5.1.2 普通文件 41
5.1.4 设备文件 42
5.1.5 命名管道 43
5.2 所有者、组和权限 43
5.2.1 查看权限 44
5.2.2 改变文件和目录权限 45
5.2.3 改变所有者和组 47
5.3 小结 48
5.4 问题 49
6.1.1 前台进程 50
6.1 启动一个进程 50
第6学 时进程 50
6.1.2 后台进程 51
6.2 列出正在运行的进程 55
6.2.1 jobs命令 55
6.2.2 ps命令 55
6.3 杀死一个进程(kill命令) 57
6.4 父进程和子进程 58
6.4.1 任务ID和进程ID 58
6.4.2 SubShells 58
6.4.4 覆盖当前进程(exec命令) 59
6.4.3 进程权限 59
6.5 小结 60
6.6 问题 60
6.7 术语 60
第二部分 Shell编程 63
第7学 时变量 63
7.1 定义变量 63
7.1.1 变量名 63
7.1.2 访问值 64
7.1.3 数组变量 64
7.1.4 访问数组值 66
7.1.5 只读变量 67
7.2 删除变量 67
7.3 环境变量 67
7.3.1 导出环境变量 68
7.3.2 Shell变量 69
7.4 小结 69
7.5 问题 69
7.6 术语 70
8.1 文件名替换 71
8.1.1 使用*通配符 71
第8学 时替换 71
8.1.2 使用?通配符 73
8.1.3 匹配字符集 73
8.2 变量替换 74
8.2.1 替换缺省值 75
8.2.2 赋予一个缺省值 75
8.2.3 由于变量错误而导致中止 75
8.3 命令和算术替换 76
8.3.1 命令替换 76
8.5 问题 77
8.4 小结 77
8.3.2 算术替换 77
第9学 时引用 78
9.1 用反斜线引用 78
9.2 使用单撇号 79
9.3 使用双撇号 80
9.4 引用规则和环境 81
9.4.1 引用忽略了单词边界 81
9.4.2 命令中的组合引用 81
9.4.3 在单个参数中嵌入空格 81
9.4.5 为访问包含特殊字符的文件名而引用 82
9.4.4 引用换行符达到在下一 82
行续行的目的 82
9.4.6 引用正规表达式通配符 83
9.4.7 引用反斜线开启echo转义序列 83
9.4.8 为cpio和find命令引用通配符 84
9.5 小结 84
9.6 问题 85
9.7 术语 85
第10学 时流控制 87
10.1 if语句 87
10.1.1 一个if语句的实例 88
10.1.2 使用test 89
10.2 case语句 95
10.2.1 case语句的实例 95
10.2.2 使用模式(pattern) 96
10.3 小结 96
10.4 问题 97
第11学 时循环 98
11.1 while循环 98
11.1.1 while循环嵌套 99
11.1.2 until循环 101
11.2.1 for循环 102
11.2 for和select循环 102
11.2.2 select循环 103
11.3 循环控制 105
11.3.1 无限循环和break命令 105
11.3.2 continue命令 106
11.4 小结 107
11.5 问题 107
11.6 术语 107
12.1 特殊变量 109
第12学 时参数 109
12.1.1 使用$0 110
12.1.2 usage语句 110
12.2 选项和参数 111
12.2.1 一个处理参数的实例 111
12.2.2 使用basename命令 112
12.2.3 公用参数处理问题 112
12.3 Shell脚本中的选项分析 114
12.5 问题 118
12.4 小结 118
第13学 时输入/输出 119
13.1 输出 119
13.1.1 向终端输出 119
13.1.2 输出重定向 125
13.2 输入 127
13.2.1 输入重定向 127
13.2.2 读取用户输入 128
13.3 文件描述符 129
13.2.3 管道 129
13.3.1 将文件和文件描述符关联起来 130
13.3.2 输入/输出重定向通用的格式 130
13.4 小结 133
13.5 问题 133
13.6 术语 134
第14学 时函数 135
14.1 创建和使用函数 135
14.1.1 激活一个函数 135
14.1.2 函数举例 136
14.2.1 在文件系统间移动 138
14.2 在函数间共享数据以及共享数据的一个示例 138
14.2.2 实现dirs 139
14.2.3 实现pushd 139
14.2.4 实现popd 140
14.3 小结 142
14.4 问题 142
第15学 时文本过滤器 143
15.1 head和tail命令 143
15.1.1 head命令 143
15.1.2 tail命令 144
15.2 使用grep 145
15.2.1 查找单词 145
15.2.2 从STDIN(标准输入)中读入 146
15.2.3 行号 147
15.2.4 只列出文件名 147
15.3 统计单词的总数 148
15.3.1 tr命令 148
15.3.2 sort命令 150
15.3.3 uniq命令 150
15.3.4 为数字排序 151
15.3.5 tr命令中字符分类的使用 152
15.4 小结 154
15.5 问题 154
第16学 时使用正规表达式过滤文本 155
16.1 awk和sed基础 155
16.1.1 激活语法 155
16.1.2 基本操作 155
16.1.3 正规表达式 156
16.2 使用sed 160
16.2.2 删除行 161
16.2.1 打印行 161
16.2.3 执行替换 162
16.2.4 使用多个sed命令 164
16.2.5 在管道中使用sed 164
16.3 小结 165
16.4 问题 165
第17学 时使用awk过滤文本 167
17.1 什么是awk 167
17.1.1 基本语法 167
17.1.2 域编辑 168
17.1.3 执行“模式——特定”行为 169
17.1.4 比较操作符 170
17.1.5 使用STDIN作为输入 172
17.2 利用awk的特点 172
17.2.1 变量 172
17.2.2 流控制 178
17.3 小结 181
17.4 问题 181
17.5 术语 183
18.1 eval命令 184
第18学 时各种工具 184
18.2 “:”命令 185
18.3 type命令 185
18.4 sleep命令 186
18.5 find命令 187
18.5.1 find:开始目录 187
18.5.2 find:-name选项 188
18.5.3 find:type选项 189
18.5.4 find:-mtime,-atime,-ctime 189
18.5.8 find:-print动作 190
18.5.7 find:否定选项 190
18.5.6 find:组合选项 190
18.5.5 find:-size选项 190
18.5.9 find:-exec动作 191
18.6 xargs 191
18.7 expr命令 192
18.8 bc命令 193
18.9 remsh/rsh/rcmd/remote(远程Shell) 194
18.1 0小结 195
18.1 1问题 195
18.1 2术语 196
第三部分 高级主题 197
第19学 时信号处理 197
19.1 信号代表什么 197
19.1.1 获得一个信号列表 197
19.1.2 缺省动作 198
19.1.3 传递信号 198
19.2 处理信号 199
19.2.1 trap命令 200
19.2.2 清除临时文件 200
19.2.3 忽略信号 201
19.2.4 建立一个计时器 202
19.3 小结 204
19.4 问题 204
第20学 时调试 205
20.1 启动调试 205
20.2 语法检查 207
20.2.1 为什么应该使用语法检查 207
20.2.2 使用verbose模式 208
20.3 Shell跟踪 209
20.3.1 使用Shell跟踪发现语法缺陷 210
20.3.2 使用Shell跟踪找出逻辑缺陷 212
20.3.3 使用调试陷阱 213
20.4 小结 215
20.5 问题 215
第21学 时使用函数解决问题 216
21.1 创建一个函数库 216
21.1.1 创建库 216
21.1.2 从一个库中包含函数 217
21.1.3 命名习惯 217
21.2.1 显示信息 218
21.2 有用的函数 218
21.2.2 询问一个问题 219
21.2.3 检查磁盘空间 223
21.2.4 通过名字获得进程ID 225
21.2.5 获得一个用户ID 226
21.2.6 完整函数库 227
21.3 小结 231
21.4 问题 231
21.5 术语 231
22.1 移动目录 232
第22学 时使用Shell脚本解决问题 232
22.1.1 使用tar 233
221.2 mvdir.sh 233
22.1.3 mvdir.sh概述 235
22.1.4 示例 236
22.2 维护一个地址簿 237
22.2.1 显示信息 238
22.2.2 增加信息 239
22.2.3 删除信息 242
22.4 问题 245
22.3 小结 245
22.5 术语 247
第23学 时脚本可移植性 248
23.1 判断UNIX版本 248
23.1.1 BSD和SystemV 248
23.1.2 使用uname 249
23.1.3 使用函数判断UNIX版本 250
23.2 提高可移植性的技巧 251
23.2.1 条件执行 252
23.2.2 抽取 253
23.5 术语 255
23.3 小结 255
23.4 问题 255
第24学 时Shell编程疑难解答 256
24.1 有关Shell和命令的问题 256
24.2 有关变量和参数的问题 258
24.3 有关文件和目录的问题 259
24.4 小结 262
第四部分 附录 263
附录A 命令快速参考 263
附录B 词汇表 273
附录C 习题答案 279