第1篇 Linux Shell基础知识与命令
第1章 Linux和Linux Shell简介 2
1.1 关于Linux 2
1.1.1 什么是Linux 2
1.1.2 谁创建了Linux 3
1.1.3 Linux在日常生活中的应用 3
1.1.4 Linux内核是什么 3
1.1.5 Linux的理念 4
1.2 什么是Linux Shell 4
1.3 Shell的种类 5
1.4 怎样使用Shell 7
1.5 Shell脚本是什么 7
1.6 为什么使用Shell脚本 8
1.7 实例:创建第一个Shell脚本 8
1.8 小结 9
1.9 习题 10
第2章 初识Linux Shell 11
2.1 Bash概述 11
2.1.1 Bash简介 11
2.1.2 Bash的改进 11
2.2 Shell在Linux环境中的角色 12
2.2.1 与登录Shell相关的文件 12
2.2.2 Bash启动脚本 12
2.2.3 实例:定制自己的Bash登录脚本 13
2.2.4 Bash退出脚本 15
2.2.5 实例:定制自己的Bash退出脚本 15
2.2.6 有效地登录Shell的路径 15
2.3 Shell变量 16
2.3.1 变量的类型 16
2.3.2 实例:如何定义变量并给变量赋值 18
2.3.3 变量的命名规则 19
2.3.4 实例:使用echo和printf命令打印变量的值 20
2.3.5 变量的引用 23
2.3.6 实例:export语句的使用 24
2.3.7 实例:如何删除变量 25
2.3.8 实例:如何检查变量是否存在 26
2.4 Shell环境进阶 26
2.4.1 实例:回调历史命令 26
2.4.2 实例:Shell的扩展部分 28
2.4.3 实例:创建和使用别名 30
2.4.4 实例:修改Bash提示符 32
2.4.5 实例:设置Shell选项 34
2.5 小结 37
2.6 习题 38
第3章 常用的Shell(Bash)命令 39
3.1 查看文件和目录 39
3.1.1 ls命令实例:列出文件名和目录 39
3.1.2 cat命令实例:连接显示文件内容 43
3.1.3 less和more命令实例:分屏显示文件 45
3.1.4 head命令实例:显示文件的头部内容 47
3.1.5 tail命令实例:显示文件的尾部内容 48
3.1.6 file命令实例:查看文件类型 49
3.1.7 wc命令实例:查看文件的统计信息 50
3.1.8 find命令实例:查找文件或目录 51
3.2 操作文件和目录 52
3.2.1 touch命令实例:创建文件 52
3.2.2 mkdir命令实例:创建目录 53
3.2.3 cp命令实例:复制文件或目录 54
3.2.4 ln命令实例:链接文件或目录 55
3.2.5 mv命令实例:重命名文件或目录 56
3.2.6 rm命令实例:删除文件或目录 57
3.3 管理文件和目录的权限 58
3.3.1 ls -l:显示文件和目录的权限 58
3.3.2 chmod命令实例:修改权限 59
3.3.3 chown和chgrp命令实例:修改文件的所有者和用户组 61
3.3.4 设置setuid和setgid权限位实例:设置用户和组权限位 63
3.4 文本处理 64
3.4.1 sort命令实例:文本排序 64
3.4.2 uniq命令实例:文本去重 66
3.4.3 tr命令实例:替换或删除字符 68
3.4.4 grep命令实例:查找字符串 69
3.4.5 diff命令实例:比较两个文件 70
3.5 其他常用的命令 72
3.5.1 hostname命令实例:查看主机名 72
3.5.2 w和who命令实例:列出系统登录的用户 73
3.5.3 uptime命令实例:查看系统运行时间 74
3.5.4 uname命令实例:查看系统信息 74
3.5.5 date命令实例:显示和设置系统日期和时间 75
3.5.6 id命令实例:显示用户属性 76
3.6 小结 77
3.7 习题 78
第4章 Shell命令进阶 80
4.1 文件处理和归档 80
4.1.1 paste命令实例:合并文件 80
4.1.2 dd命令实例:备份和复制文件 82
4.1.3 gzip和bzip2命令实例:压缩和归档文件 83
4.1.4 gunzip和bunzip2命令实例:解压缩文件 84
4.1.5 tar命令实例:打包和解包文件 84
4.2 监测和管理磁盘 86
4.2.1 mount和umount命令实例:挂载和卸载存储介质 86
4.2.2 df命令实例:报告文件系统磁盘空间的利用率 88
4.2.3 du命令实例:评估文件空间的利用率 89
4.3 后台执行命令 91
4.3.1 crond和crontab命令实例:执行计划任务 91
4.3.2 at命令实例:在指定时间执行命令 92
4.3.3 &控制操作符实例:将任务放在后台运行 94
4.3.4 nohup命令实例:运行一个对挂起“免疫”的命令 95
4.4 小结 95
4.5 习题 96
第2篇 Shell脚本编程
第5章 Shell编程基础 100
5.1 Shell脚本的第一行“#!” 100
5.2 Shell脚本注释 100
5.3 实例:如何设置脚本的权限并执行脚本 101
5.4 Shell变量进阶 102
5.4.1 Bash的参数扩展 102
5.4.2 Bash的内部变量 106
5.4.3 Bash的位置参数和特殊参数 108
5.4.4 实例:使用declare指定变量的类型 110
5.4.5 Bash的数组变量 111
5.5 Shell算术运算 112
5.5.1 Bash的算术运算符 112
5.5.2 数字常量 114
5.5.3 使用算术扩展和let命令进行算术运算 115
5.5.4 实例:使用expr命令 116
5.6 退出脚本 117
5.6.1 退出状态码 117
5.6.2 实例:使用exit命令 118
5.7 实例:调试脚本 119
5.8 Shell脚本编程风格 121
5.9 小结 122
5.10 习题 123
第6章 Shell的条件执行 124
6.1 条件测试 124
6.1.1 实例:使用test命令 124
6.1.2 if结构的语法格式 129
6.1.3 实例:if…else…fi语句 130
6.1.4 实例:嵌套的if…else语句 131
6.1.5 实例:多级的if…elif…else…fi 132
6.2 条件执行 133
6.2.1 实例:逻辑与&& 133
6.2.2 实例:逻辑或|| 138
6.2.3 实例:逻辑非! 141
6.3 case语句实例 141
6.4 小结 143
6.5 习题 144
第7章 Bash循环 145
7.1 for循环 145
7.1.1 for循环的语法 145
7.1.2 实例:嵌套for循环语句 147
7.2 while循环 148
7.2.1 while循环的语法 148
7.2.2 实例:定义无限while循环 150
7.3 until循环语句实例 152
7.4 select循环语句实例 153
7.5 循环控制 154
7.5.1 实例:break语句 154
7.5.2 实例:continue语句 156
7.6 小结 157
7.7 习题 157
第8章 Shell函数 159
8.1 函数的定义 159
8.2 函数的参数、变量与返回值 160
8.2.1 实例:向函数传递参数 160
8.2.2 本地变量 161
8.2.3 实例:使用return命令 163
8.2.4 实例:函数返回值测试 163
8.3 函数的调用 164
8.3.1 实例:在Shell命令行中调用函数 164
8.3.2 实例:在脚本中调用函数 164
8.3.3 实例:从函数文件中调用函数 165
8.3.4 实例:递归函数调用 168
8.4 实例:将函数放在后台运行 168
8.5 小结 170
8.6 习题 170
第9章 正则表达式 171
9.1 正则表达式简介 171
9.1.1 正则表达式的定义 171
9.1.2 正则表达式的类型 171
9.1.3 POSIX字符类 172
9.1.4 Bash正则表达式比较操作符 173
9.2 正则表达式应用基础 174
9.2.1 实例:使用句点(.)匹配单字符 174
9.2.2 实例:使用插入符号(^)进行匹配 175
9.2.3 实例:使用美元符号($)进行匹配 175
9.2.4 实例:使用星号(*)进行匹配 175
9.2.5 实例:使用方括号([ ])进行匹配 176
9.2.6 实例:使用问号(?)进行匹配 176
9.2.7 实例:使用加号(+)进行匹配 176
9.2.8 实例:使用(?|regex)进行匹配 177
9.2.9 实例:使用(?<=regex) 和(?<!regex)进行匹配 177
9.3 小结 178
9.4 习题 178
第10章 脚本输入处理 180
10.1 参数处理 180
10.1.1 实例:使用case语句处理命令行参数 180
10.1.2 实例:使用shift命令处理命令行参数 184
10.1.3 实例:使用for循环读取多个参数 186
10.1.4 实例:读取脚本名 188
10.1.5 实例:测试命令行参数 189
10.2 选项处理 191
10.2.1 实例:使用case语句处理命令行选项 191
10.2.2 实例:使用getopts处理多命令行选项 193
10.2.3 实例:使用getopt处理多命令行选项 198
10.3 获得用户的输入信息 203
10.3.1 实例:基本信息的读取 203
10.3.2 实例:输入超时 204
10.3.3 实例:隐式地读取用户输入的密码 205
10.3.4 实例:从文件中读取数据 206
10.4 小结 208
10.5 习题 210
第11章 Shell重定向 211
11.1 输入和输出 211
11.1.1 标准输入 211
11.1.2 标准输出 212
11.1.3 标准错误 213
11.2 重定向 214
11.2.1 文件重定向 214
11.2.2 实例:从文件中读取信息 216
11.2.3 实例:从标准输入中读取文本或字符串 220
11.2.4 实例:创建空文件 222
11.2.5 实例:丢弃不需要的输出 223
11.2.6 实例:标准错误重定向 223
11.2.7 实例:标准输出重定向 224
11.2.8 实例:标准错误和输出同时重定向 224
11.2.9 实例:追加重定向输出 225
11.2.10 实例:在单命令行中进行标准输入、输出重定向 225
11.3 文件描述符 226
11.3.1 实例:使用exec命令 226
11.3.2 实例:指定用于输入的文件描述符 228
11.3.3 实例:指定用于输出的文件描述符 230
11.3.4 实例:关闭文件描述符 235
11.3.5 实例:打开用于读和写的文件描述符 236
11.3.6 实例:在同一个脚本中使用exec进行输入和输出重定向 237
11.4 小结 238
11.5 习题 240
第12章 管道和过滤器 241
12.1 管道 241
12.1.1 操作符“|”和“>”的区别 241
12.1.2 为什么使用管道 242
12.1.3 实例:使用管道连接程序 242
12.1.4 实例:管道中的输入重定向 244
12.1.5 实例:管道中的输出重定向 245
12.2 过滤器 246
12.2.1 实例:在管道中使用awk命令 247
12.2.2 实例:在管道中使用cut命令 248
12.2.3 实例:在管道中使用grep命令 248
12.2.4 实例:在管道中使用tar命令 249
12.2.5 实例:在管道中使用head命令 250
12.2.6 实例:在管道中使用paste命令 250
12.2.7 实例:在管道中使用sed命令 251
12.2.8 实例:在管道中使用sort命令 252
12.2.9 实例:在管道中使用split命令 253
12.2.10 实例:在管道中使用strings命令 253
12.2.11 实例:在管道中使用tail命令 254
12.2.12 实例:在管道中使用tee命令 254
12.2.13 实例:在管道中使用tr命令 256
12.2.14 实例:在管道中使用uniq命令 257
12.2.15 实例:在管道中使用wc命令 257
12.3 小结 258
12.4 习题 258
第13章 捕获 259
13.1 信号 259
13.1.1 Linux中的信号 259
13.1.2 信号的名称和值 260
13.1.3 Bash中的信号 262
13.2 进程 263
13.2.1 什么是进程 263
13.2.2 前台进程和后台进程 264
13.2.3 进程的状态 265
13.2.4 实例:怎样查看进程 265
13.2.5 实例:向进程发送信号 268
13.2.6 关于子Shell 269
13.3 捕获 273
13.3.1 trap语句 273
13.3.2 实例:使用trap语句捕获信号 275
13.3.3 实例:移除捕获 279
13.4 小结 280
13.5 习题 281
第14章 sed和awk 283
14.1 sed编辑器基础 283
14.1.1 sed简介 283
14.1.2 sed的模式空间 284
14.2 sed的基本命令 285
14.2.1 追加、更改和插入命令 286
14.2.2 删除命令 288
14.2.3 替换命令 288
14.2.4 打印命令 290
14.2.5 打印行号命令 291
14.2.6 读取下一行命令 292
14.2.7 读和写文件命令 293
14.2.8 退出命令 297
14.3 sed命令实例 298
14.3.1 实例:向文件中添加或插入行 298
14.3.2 实例:更改文件中指定的行 300
14.3.3 实例:删除文件中的行 300
14.3.4 实例:替换文件中的内容 302
14.3.5 实例:打印文件中的行 305
14.3.6 实例:打印文件中的行号 308
14.3.7 实例:从文件中读取和向文件中写入 308
14.4 sed与Shell 312
14.4.1 实例:在sed中使用Shell变量 312
14.4.2 实例:从sed输出中设置shell变量 318
14.5 awk基础 319
14.5.1 awk简介 319
14.5.2 awk的基本语法 320
14.5.3 第一个awk命令 321
14.5.4 使用awk打印指定的列 322
14.5.5 从awk程序文件中读取awk命令 322
14.5.6 awk的BEGIN和END块 323
14.5.7 在awk中使用正则表达式 323
14.5.8 awk的表达式和块 323
14.5.9 awk的条件语句 324
14.5.10 awk的变量和操作符 325
14.5.11 awk的特殊变量 326
14.5.12 awk的循环结构 327
14.5.13 awk的数组 328
14.6 awk与Shell 329
14.6.1 实例:在awk中使用Shell变量 329
14.6.2 实例:从awk命令的输出中设置Shell变量 330
14.7 awk命令实例 332
14.7.1 实例:使用awk编写字符统计工具 332
14.7.2 实例:使用awk程序统计文件的总列数 333
14.7.3 实例:使用awk自定义显示文件的属性信息 334
14.7.4 实例:使用awk显示ASCII字符 335
14.7.5 实例:使用awk获取进程号 337
14.8 小结 339
14.9 习题 341
第15章 其他Linux Shell概述 343
15.1 C Shell概述 343
15.1.1 csh简介 343
15.1.2 csh的特性 344
15.1.3 csh的内部变量 345
15.1.4 csh的内部命令 345
15.1.5 tcsh在csh基础上的新特性 349
15.2 Korn Shell概述 358
15.2.1 ksh简介 358
15.2.2 ksh的特性 359
15.2.3 ksh的内部变量 363
15.2.4 ksh的内部命令 365
15.2.5 增强的ksh93u+ 372
15.3 Z Shell概述 376
15.3.1 zsh简介 377
15.3.2 zsh的特性 377
15.3.3 zsh的内部变量 377
15.3.4 zsh的内部命令 378
15.4 小结 378
15.5 习题 379