目录
第1篇 认识Shell编程
第1章 Shell入门基础 2
1.1 为什么学习和使用Shell编程 2
1.2 Shell简介 2
1.2.1 Shell的起源 3
1.2.2 Shell的功能 4
1.2.3 Shell的分类 4
1.3 Shell的特性 5
1.3.1 交互式程序 5
1.3.2 创建脚本 6
1.3.3 设置可执行脚本 6
1.4 向脚本传递参数 7
1.4.1 Shell脚本的参数 8
1.4.2 参数的扩展 9
1.5 第一个Shell程序 10
1.5.1 Shell脚本的基本元素 10
1.5.2 指定命令解读器 11
1.5.3 Shell脚本的注释和风格 12
1.5.4 如何执行Shell程序 13
1.5.5 Shell程序的退出状态 13
1.6 小结 15
1.7 习题 15
第2章 Shell编程环境的搭建 17
2.1 在不同的操作系统上搭建Shell编程环境 17
2.1.1 在Windows上搭建Shell编程环境 17
2.1.2 在Linux上搭建Shell编程环境 20
2.1.3 在FreeBSD上搭建Shell编程环境 22
2.2 编辑器的选择 23
2.2.1 图形化编辑器 24
2.2.2 vi(vim)编辑器 24
2.3 系统环境的搭建 30
2.3.1 Shell配置文件 30
2.3.2 命令别名 33
2.4 小结 34
2.5 习题 34
第2篇 Shell编程核心技术
第3章 变量和引用 36
3.1 深入理解变量 36
3.1.1 什么是变量 36
3.1.2 变量的命名 36
3.1.3 变量的类型 37
3.1.4 变量的定义 39
3.1.5 变量和引号 42
3.1.6 变量的作用域 42
3.1.7 系统变量 45
3.1.8 环境变量 47
3.2 变量的赋值和清空 48
3.2.1 变量的赋值 49
3.2.2 引用变量的值 49
3.2.3 清除变量 50
3.3 引用和替换 51
3.3.1 引用 51
3.3.2 全引用 52
3.3.3 部分引用 52
3.3.4 命令替换 53
3.3.5 转义 54
3.4 小结 54
3.5 习题 54
第4章 条件测试和判断语句 56
4.1 条件测试 56
4.1.1 条件测试的基本语法 56
4.1.2 字符串测试 57
4.1.3 整数测试 60
4.1.4 文件测试 62
4.1.5 逻辑操作符 65
4.2 条件判断语句 66
4.2.1 使用简单的if语句进行条件判断 66
4.2.2 使用if…else语句进行流程控制 69
4.2.3 使用if…elif语句进行多条件判断 71
4.2.4 使用exit语句退出程序 72
4.3 多条件判断语句case 74
4.3.1 case的基本语法 74
4.3.2 利用case语句处理选项参数 75
4.3.3 利用case语句处理用户的输入 77
4.4 运算符 78
4.4.1 算术运算符 78
4.4.2 位运算符 82
4.4.3 自增或自减运算符 84
4.4.4 数字常量的进制 85
4.5 小结 86
4.6 习题 86
第5章 循环结构 88
5.1 步进循环语句for 88
5.1.1 带列表的for循环语句 88
5.1.2 不带列表的for循环语句 93
5.1.3 类C风格的for循环语句 93
5.1.4 使用for循环语句处理数组 95
5.2 until循环语句 96
5.2.1 until语句的基本语法 96
5.2.2 利用until语句批量增加用户 97
5.3 while循环语句 99
5.3.1 while语句的基本语法 99
5.3.2 通过计数器控制while循环结构 99
5.3.3 通过结束标记控制while循环结构 100
5.3.4 理解while语句与until语句的区别 101
5.4 嵌套循环 102
5.5 利用break和continue语句控制循环 103
5.5.1 利用break语句控制循环 103
5.5.2 利用continue语句控制循环 105
5.5.3 分析break语句和continue语句的区别 106
5.6 小结 109
5.7 习题 109
第6章 函数 111
6.1 函数的基础知识 111
6.1.1 什么是函数 111
6.1.2 函数的定义 112
6.1.3 函数的调用 113
6.1.4 函数链接 114
6.1.5 函数的返回值 115
6.1.6 函数和别名 117
6.1.7 全局变量和局部变量 118
6.2 函数的参数 120
6.2.1 包含参数的函数的调用方法 120
6.2.2 获取函数参数的个数 121
6.2.3 通过位置变量接收参数值 122
6.2.4 移动位置参数 122
6.2.5 通过getopts接收函数的参数 123
6.2.6 传递间接参数 124
6.2.7 通过全局变量传递数据 126
6.2.8 传递数组参数 126
6.3 函数库文件 128
6.3.1 函数库文件的定义 128
6.3.2 函数库文件的调用 129
6.4 递归函数 130
6.5 小结 132
6.6 习题 133
第7章 数组 134
7.1 定义数组 134
7.1.1 通过指定元素值定义数组 134
7.1.2 通过declare语句定义数组 135
7.1.3 通过元素值集合定义数组 136
7.1.4 通过键值对定义数组 137
7.1.5 数组和普通变量 138
7.2 数组的赋值 139
7.2.1 按索引为元素赋值 139
7.2.2 通过集合为数组赋值 140
7.2.3 在数组末尾追加新元素 141
7.2.4 通过循环为数组元素赋值 142
7.3 访问数组 142
7.3.1 访问第1个数组元素 142
7.3.2 通过下标访问数组元素 143
7.3.3 计算数组的长度 143
7.3.4 通过循环遍历数组元素 145
7.3.5 引用所有的数组元素 145
7.3.6 以切片方式获取部分数组元素 146
7.3.7 数组元素的替换 148
7.4 删除数组 149
7.4.1 删除指定的数组元素 149
7.4.2 删除整个数组 150
7.5 数组的其他操作 151
7.5.1 复制数组 151
7.5.2 连接数组 151
7.5.3 将文件内容加载到数组中 152
7.6 小结 153
7.7 习题 153
第8章 正则表达式 154
8.1 正则表达式简介 154
8.1.1 为什么使用正则表达式 154
8.1.2 如何学习正则表达式 155
8.1.3 如何实践正则表达式 156
8.2 正则表达式基础 156
8.2.1 正则表达式的原理 156
8.2.2 标准正则表达式 157
8.2.3 扩展正则表达式 161
8.2.4 Perl正则表达式 163
8.2.5 正则表达式的字符集 164
8.3 正则表达式的应用 165
8.3.1 匹配单个字符 166
8.3.2 匹配多个字符 168
8.3.3 匹配字符串的开头或者结尾 170
8.3.4 运算符的优先级 171
8.3.5 子表达式 172
8.3.6 通配符 174
8.4 grep命令 175
8.4.1 grep命令的基本语法 175
8.4.2 grep命令族简介 176
8.5 小结 177
8.6 习题 177
第9章 文本处理 178
9.1 使用echo命令输出文本 178
9.1.1 显示普通字符串 178
9.1.2 显示转义字符 179
9.1.3 显示变量 181
9.1.4 换行和不换行 182
9.1.5 显示命令的执行结果 183
9.1.6 echo命令的执行结果重定向 183
9.2 文本格式化的输出 184
9.2.1 使用UNIX制表符 184
9.2.2 使用fold命令格式化行 185
9.2.3 使用fmt命令格式化段落 187
9.2.4 使用rev命令反转字符顺序 189
9.2.5 使用pr命令格式化文本页 190
9.3 使用sort命令对文本进行排序 193
9.3.1 sort命令的基本用法 193
9.3.2 使用单个关键字进行排序 194
9.3.3 根据指定的列进行排序 198
9.3.4 根据关键字进行降序排序 198
9.3.5 数值列的排序 200
9.3.6 自定义列分隔符 201
9.3.7 删除重复的行 202
9.3.8 根据多个关键字进行排序 202
9.3.9 使用sort命令合并文件 204
9.4 文本的统计 205
9.4.1 输出包含行号的文本行 205
9.4.2 统计行数 207
9.4.3 统计单词数和字符数 209
9.5 使用cut命令选取文本列 209
9.5.1 cut命令及其语法 210
9.5.2 选择指定的文本列 211
9.5.3 选择指定数量的字符 212
9.5.4 排除不包含列分隔符的行 213
9.6 使用paste命令拼接文本列 214
9.6.1 paste命令及其语法 214
9.6.2 自定义列分隔符 216
9.6.3 拼接指定的文本列 216
9.7 使用join命令连接文本列 217
9.7.1 join命令及其语法 217
9.7.2 指定连接关键字列 219
9.7.3 内连接文本文件 220
9.7.4 左连接文本文件 220
9.7.5 右连接文本文件 221
9.7.6 全连接文本文件 222
9.7.7 自定义输出列 222
9.8 使用tr命令替换文件内容 223
9.8.1 tr命令及其语法 223
9.8.2 去除重复出现的字符 224
9.8.3 删除空行 225
9.8.4 大小写转换 225
9.8.5 删除指定的字符 226
9.9 小结 227
9.10 习题 227
第10章 流编辑器 229
10.1 sed命令简介 229
10.1.1 sed命令的基本语法 229
10.1.2 sed命令的工作方式 231
10.1.3 使用行号定位文本行 231
10.1.4 使用正则表达式定位文本行 232
10.2 sed命令的常用操作 233
10.2.1 sed命令的基本语法 233
10.2.2 选择文本 234
10.2.3 替换文本 236
10.2.4 删除文本 239
10.2.5 追加文本 242
10.2.6 插入文本 243
10.3 组合命令 243
10.3.1 使用-e选项执行多个子命令 244
10.3.2 使用分号执行多个子命令 244
10.3.3 对一个地址使用多个子命令 245
10.3.4 sed脚本文件 246
10.4 小结 248
10.5 习题 249
第11章 文本处理利器awk命令 250
11.1 awk命令简介 250
11.1.1 awk命令的功能 250
11.1.2 awk命令的基本语法 251
11.1.3 awk命令的工作流程 252
11.1.4 执行awk命令的几种方式 252
11.2 awk命令的模式匹配 254
11.2.1 关系表达式 254
11.2.2 正则表达式 255
11.2.3 混合模式 256
11.2.4 区间模式 256
11.2.5 BEGIN模式 257
11.2.6 END模式 258
11.3 变量 259
11.3.1 变量的定义和引用 259
11.3.2 系统内置变量 260
11.3.3 记录分隔符和字段分隔符 260
11.3.4 记录和字段的引用 263
11.4 运算符和表达式 264
11.4.1 算术运算符 264
11.4.2 赋值运算符 265
11.4.3 条件运算符 266
11.4.4 逻辑运算符 266
11.4.5 关系运算符 267
11.4.6 其他运算符 268
11.5 函数 268
11.5.1 字符串函数 268
11.5.2 算术函数 272
11.6 数组 273
11.6.1 数组的定义和赋值 273
11.6.2 遍历数组 274
11.7 流程控制 276
11.7.1 if语句 276
11.7.2 while语句 277
11.7.3 do…while语句 278
11.7.4 for语句 279
11.7.5 break语句 280
11.7.6 continue语句 281
11.7.7 next语句 282
11.7.8 exit语句 283
11.8 awk命令格式化的输出 283
11.8.1 基本的print语句 283
11.8.2 格式化输出printf()函数 283
11.8.3 使用sprintf()函数生成格式化字符串 284
11.9 awk命令与Shell的交互 285
11.9.1 通过管道实现与Shell的交换 285
11.9.2 通过system()函数实现与Shell的交互 286
11.10 小结 287
11.11 习题 287
第12章 文件操作 288
12.1 文件的基础知识 288
12.1.1 列出文件 288
12.1.2 文件的类型 289
12.1.3 文件的权限 292
12.2 查找文件 293
12.2.1 find命令及其语法 293
12.2.2 find命令——路径 294
12.2.3 find命令——测试 295
12.2.4 find命令——使用!运算符对测试求反 298
12.2.5 find命令——处理文件权限错误信息 298
12.2.6 find命令——动作 299
12.3 比较文件 300
12.3.1 使用comm比较文件 301
12.3.2 使用diff比较文件 304
12.4 文件描述符 307
12.4.1 什么是文件描述符 307
12.4.2 标准输入、标准输出和标准错误 308
12.5 重定向 309
12.5.1 输出重定向(覆盖) 309
12.5.2 输出重定向(追加) 311
12.5.3 输入重定向 311
12.5.4 当前文档 312
12.5.5 重定向两个文件描述符 313
12.5.6 使用exec命令分配文件描述符 313
12.6 小结 315
12.7 习题 315
第13章 子Shell与进程处理 317
13.1 子Shell 317
13.1.1 什么是子Shell 317
13.1.2 内部命令、保留字和外部命令 318
13.1.3 在子Shell中执行命令 321
13.1.4 把子Shell中的变量值传回父Shell 325
13.2 进程处理 327
13.2.1 什么是进程 327
13.2.2 通过脚本监控进程 328
13.2.3 作业控制 329
13.2.4 信号与trap命令 332
13.3 小结 334
13.4 习题 334
第3篇 Shell编程实战
第14章 Shell脚本调试技术 336
14.1 Shell脚本中的常见错误 336
14.1.1 常见的语法错误 336
14.1.2 常见的逻辑错误 339
14.2 Shell脚本调试技术 340
14.2.1 使用echo命令调试脚本 340
14.2.2 使用trap命令调试Shell脚本 341
14.2.3 使用tee命令调试Shell脚本 343
14.2.4 使用调试钩子调试Shell脚本 344
14.3 小结 346
14.4 习题 346
第15章 利用Shell脚本解决实际问题 347
15.1 编写系统服务脚本 347
15.1.1 系统的启动过程 347
15.1.2 运行级别 348
15.1.3 服务脚本的基本语法 349
15.1.4 编写MySQL服务脚本 352
15.2 通过脚本管理Apache服务器日志 358
15.2.1 Apache日志简介 359
15.2.2 归档文件名生成函数 360
15.2.3 过期日志归档函数 361
15.2.4 过期日志删除函数 362
15.2.5 日志归档主程序 362
15.2.6 定时运行日志归档脚本 363
15.3 小结 367
15.4 习题 367