第1章 概述 1
1.1 为什么要学习Linux shell脚本 1
1.2 什么是shell 1
1.3 什么是shell脚本 2
1.4 为什么要学习Bash 3
1.5 Bash学习环境的准备 4
1.5.1 Linux的准备 4
1.5.2 Cygwin工具 4
1.5.3 VMware与Linux虚拟机 7
1.6 Linux命令格式简介 10
1.7 如何获得Linux命令的帮助 11
第2章 Linux基础知识与常用命令 15
2.1 Linux的文件与目录结构 15
2.2 查看文件清单命令ls 16
2.3 浏览文件命令cat、more、less、head和tail 18
2.4 文件统计命令wc 19
2.5 改变当前工作目录命令cd 20
2.6 创建目录命令mkdir 23
2.7 复制命令cp 24
2.8 重命名或移动命令mv 25
2.9 创建符号链接和硬链接命令ln 26
2.10 显示当前目录命令pwd 30
2.11 产生空文件或者改变文件时间戳命令touch 30
2.12 查看账户名及其所属组的命令whoami、id和groups 32
2.13 文件与目录的权限 32
2.14 改变权限命令chmod 35
2.15 SUID与SGID以及粘滞位 37
2.1 5.1 SUID 37
2.1 5.2 SGID 39
2.1 5.3 粘滞位 41
2.16 查看文件的三种时间 43
2.17 删除命令rm与rmdir 44
2.18 编辑文件命令vi 45
2.19 用于显示的命令echo 48
2.20 查看文件类型命令file 49
2.21 显示树状目录信息命令tree 50
2.22 查找命令find 51
第3章 Bash内置命令与环境简介 53
3.1 内置命令与外部命令 53
3.2 认识Bash环境 58
3.2.1 命令行提示PS1 59
3.2.2 搜索路径PATH 60
3.2.3 设置和取消别名命令alias和unalias 61
3.2.4 修改.bashrc——设置自己的环境 62
3.3 权限掩码命令umask 64
3.4 source命令和点命令 66
3.5 编写并运行第一个脚本 67
3.6 命令解释顺序与命令类型的查询 68
3.6.1 命令的解释顺序 68
3.6.2 改变命令解释顺序的三条内置命令 69
3.6.3 命令类型的查询 70
3.7 命令的退出状态以及命令true和false 71
3.8 管道 72
3.9 输入输出重定向 73
3.9.1 标准输入和标准输出 73
3.9.2 输入输出重定向与输出追加重定向 74
3.9.3 预防输出重定向覆盖旧文件 77
3.9.4 标准错误输出与“黑洞” 78
3.9.5 同时把结果输出至标准输出与文件的命令tee 80
3.10 exec命令与文件描述符 82
3.11 有关命令的进一步讨论 87
3.11.1 一行多命令 87
3.11.2 将命令放在后台执行 87
3.11.3 命令行的续行 88
3.11.4 命令的补齐与命令历史 89
3.11.5 操作名字含空格的文件 90
3.11.6 操作名字首字母为减号的文件 90
3.11.7 Windows与Linux文件格式的互转 91
3.11.8 小括号与大括号中的命令 92
3.11.9 子shell 92
第4章 变量与数组 94
4.1 变量的定义与清除 94
4.2 字符串定义及单双引号与大括号的使用 95
4.3 将命令执行结果赋给变量——反引号与$() 98
4.4 键盘输入变量值——内置命令read 100
4.5 整型变量运算 102
4.6 浮点运算 106
4.7 定义只读变量命令readonly和declare -r 107
4.8 定义整型变量命令declare -i 107
4.9 数组 109
4.10 关联数组 113
4.11 导出变量命令export和declare -x 114
4.12 declare命令总结 116
4.13 环境变量与特殊变量 116
4.14 内置变量 120
4.15 计算表达式值的命令expr 125
4.16 变量测试及其相应的赋值 127
4.17 字符串操作 132
4.17.1 Bash内置的字符串操作 132
4.17.2 用命令expr处理字符串 135
第5章 条件流程控制 138
5.1 条件判断与test命令 138
5.1.1 整型数关系运算 138
5.1.2 字符串关系运算 139
5.1.3 文件属性条件判断 141
5.1.4 逻辑的与或非 143
5.1.5 与或非的优先级 145
5.1.6 双中括号格式 145
5.1.7 在双小括号里面进行整数比较 147
5.1.8 命令的与或非 148
5.1.9 判断变量是否定义 150
5.2 条件测试结构if 151
5.3 if-else结构 153
5.4 if-elif结构 156
5.5 分情况选择处理——case命令 159
5.6 命令exit与if及case命令的配合 162
5.7 用here文档与case命令生成菜单 163
5.8 null命令 165
第6章 循环 169
6.1 for循环 169
6.2 算术for循环 175
6.3 while循环 177
6.4 until循环 179
6.5 用break和continue控制循环 181
6.6 用命令shift控制循环 185
6.7 选择命令select 187
6.8 循环命令与I/O重定向及管道的配合 192
6.9 脚本的选项与参数 195
6.9.1 命令shift 195
6.9.2 命令getopts 197
第7章 函数 202
7.1 函数定义 202
7.2 给函数传递参数 203
7.3 函数的局部与全局变量 204
7.4 当前的函数名FUNCNAME 206
7.5 在命令行执行函数 207
7.6 查看当前shell的函数定义 208
7.7 选项-f与函数的导出、清除与只读设置 209
7.8 返回命令return 210
7.9 递归函数 213
第8章 正则表达式与文本处理 215
8.1 文件名替换 215
8.1.1 多字符替换 215
8.1.2 单字符替换? 216
8.1.3 范围替换[]与[!] 217
8.2 正则表达式与grep 218
8.2.1 过滤器grep 218
8.2.2 扩展的egrep 224
8.2.3 POSIX字符类 224
8.2.4 Bash扩展模式匹配 226
8.3 剪取内容命令cut 227
8.4 合并相应行的命令paste 229
8.5 转换或删除字符命令tr 231
8.6 排序命令sort 233
8.7 流编辑器sed 236
8.7.1 替换命令s 236
8.7.2 其他命令 240
8.7.3 一行多条命令与保存匹配& 242
8.7.4 sed的退出状态 243
8.7.5 sed脚本 244
8.8 文本处理工具awk 245
8.9 格式化打印命令printf 251
第9章 进程与作业 254
9.1 查看进程命令ps 254
9.2 挂起进程〈Ctrl+Z〉键 255
9.3 前台fg与后台bg 256
9.4 发送信号命令kill 257
9.5 等待命令wait 259
9.6 捕获信号命令trap 261
9.7 移除作业的命令disown 264
9.8 暂停shell的命令suspend 265
第10章 高级话题 267
10.1 二次扫描命令eval 267
10.2 目录栈操作命令pushd、popd与dirs 269
10.3 波浪号扩展 272
10.4 (非)登录及(非)交互shell 273
10.5 Bash shell选项 273
10.6 用命令set设置shell 274
10.7 用命令shopt设置shell 278
10.8 终端行设置命令stty 280
10.9 不在脚本和函数内使用别名 282
10.10 Bash调试 284
10.11 并行命令parallel 287
10.12 模拟旋转型进度指示 289
10.13 删除文件空行 291
10.14 完善while-shift循环 292
附录 Bash安全漏洞shellshock 294
参考文献 297