Linux 命令行与 shell 脚本编程大全

🌙
手机阅读
本文目录结构

Linux 命令行与 shell 脚本编程大全

编辑推荐

精通 Linux 命令行与 shell 脚本编程,尽在本书中

本书是关于 Linux 命令行和 shell 命令的全面参考资料,涵盖详尽的动手教程和实际应用指南,并提供相关参考信息和背景资料,带你从 Linux 命令行基础入手,直到写出自己的 shell。

时隔四年后的这一版本,针对 Linux 的新特性和实践,进行了全面更新。

使用简单的 shell 脚本工具实现任务自动化

创建 shell 脚本,全面理解 shell 的用途

管理文件系统与软件包

使用 nano、KDE 及 GNOME 等编辑器

学习结构化命令、文本处理及正则表达式

创建与电子邮件、数据库及 Web 相关的实用脚本

优化环境、微调脚本

内容简介

这是一本关于 Linux 命令行与 shell 脚本编程的全方位教程,主要包括四大部分:Linux 命令行,shell 脚本编程基础,高级 shell 脚本编程,如何创建实用的 shell 脚本。本书针对 Linux 系统的新特性进行了全面更新,不仅涵盖了详尽的动手教程和现实世界中的实用信息,还提供了与所学内容相关的参考信息和背景资料。通过本书的学习,你将轻松写出自己的 shell 脚本。 作者简介

Ricahard Blum,已在 IT 行业打拼 20 余年,担任过 UNIX、Linux、Novell 和 Windows Server 的系统及网络管理员,在 Linux 和开源软件领域著作颇丰。他还是一名网络课程讲师,美国多所大学和学院都采用他的 Linux 基础课程。

Christine Bresnahan,系统管理员,已经在 IT 行业工作了 30 余年,通过 CompTIA Linux+、LPIC-1、Linux Essentials 认证。目前在印第安纳波利斯市常春藤技术社区学院担任兼职教授,讲授 Linux 系统管理、Linux 安全和 Windows 安全、Python 编程等课程。

目录

第一部分 Linux 命令行

第 1 章 初识 Linux shell 2

  • 1.1 什么是 Linux 2
  • 1.1.1 深入探究 Linux 内核 3
  • 1.1.2 GNU 工具 6
  • 1.1.3 Linux 桌面环境 8
  • 1.2 Linux 发行版 12
  • 1.2.1 核心 Linux 发行版 13
  • 1.2.2 特定用途的 Linux 发行版 13
  • 1.2.3 Linux LiveCD 14
  • 1.3 小结 15

第 2 章 走进 shell 16

  • 2.1 进入命令行 16
  • 2.1.1 控制台终端 17
  • 2.1.2 图形化终端 17
  • 2.2 通过 Linux 控制台终端访问 CLI 18
  • 2.3 通过图形化终端仿真访问 CLI 20
  • 2.4 使用 GNOME Terminal 仿真器 21
  • 2.4.1 访问 GNOME Terminal 21
  • 2.4.2 菜单栏 22
  • 2.5 使用 Konsole Terminal 仿真器 25
  • 2.5.1 访问 Konsole Terminal 25
  • 2.5.2 菜单栏 26
  • 2.6 使用 xterm 终端仿真器 29
  • 2.6.1 访问 xterm 30
  • 2.6.2 命令行参数 30
  • 2.7 小结 32

第 3 章 基本的 bash shell 命令 33

  • 3.1 启动 shell 33
  • 3.2 shell 提示符 34
  • 3.3 bash 手册 34
  • 3.4 浏览文件系统 37
  • 3.4.1 Linux 文件系统 37
  • 3.4.2 遍历目录 40
  • 3.5 文件和目录列表 42
  • 3.5.1 基本列表功能 42
  • 3.5.2 显示长列表 44
  • 3.5.3 过滤输出列表 45
  • 3.6 处理文件 46
  • 3.6.1 创建文件 47
  • 3.6.2 复制文件 47
  • 3.6.3 制表键自动补全 50
  • 3.6.4 链接文件 50
  • 3.6.5 重命名文件 52
  • 3.6.6 删除文件 54
  • 3.7 处理目录 55
  • 3.7.1 创建目录 55
  • 3.7.2 删除目录 55
  • 3.8 查看文件内容 58
  • 3.8.1 查看文件类型 58
  • 3.8.2 查看整个文件 59
  • 3.8.3 查看部分文件 61
  • 3.9 小结 63

第 4 章 更多的 bash shell 命令 64

  • 4.1 监测程序 64
  • 4.1.1 探查进程 64
  • 4.1.2 实时监测进程 70
  • 4.1.3 结束进程 72
  • 4.2 监测磁盘空间 73
  • 4.2.1 挂载存储媒体 73
  • 4.2.2 使用 df 命令 76
  • 4.2.3 使用 du 命令 77
  • 4.3 处理数据文件 78
  • 4.3.1 排序数据 78
  • 4.3.2 搜索数据 81
  • 4.3.3 压缩数据 83
  • 4.3.4 归档数据 84
  • 4.4 小结 85

第 5 章 理解 shell 86

  • 5.1 shell 的类型 86
  • 5.2 shell 的父子关系 88
  • 5.2.1 进程列表 91
  • 5.2.2 别出心裁的子 shell 用法 93
  • 5.3 理解 shell 的内建命令 96
  • 5.3.1 外部命令 96
  • 5.3.2 内建命令 97
  • 5.4 小结 101

第 6 章 使用 Linux 环境变量 103

  • 6.1 什么是环境变量 103
  • 6.1.1 全局环境变量 104
  • 6.1.2 局部环境变量 105
  • 6.2 设置用户定义变量 106
  • 6.2.1 设置局部用户定义变量 106
  • 6.2.2 设置全局环境变量 107
  • 6.3 删除环境变量 109
  • 6.4 默认的 shell 环境变量 110
  • 6.5 设置 PATH 环境变量 113
  • 6.6 定位系统环境变量 114
  • 6.6.1 登录 shell 115
  • 6.6.2 交互式 shell 进程 119
  • 6.6.3 非交互式 shell 120
  • 6.6.4 环境变量持久化 121
  • 6.7 数组变量 121
  • 6.8 小结 122

第 7 章 理解 Linux 文件权限 124

  • 7.1 Linux 的安全性 124
  • 7.1.1 /etc/passwd 文件 124
  • 7.1.2 /etc/shadow 文件 126
  • 7.1.3 添加新用户 127
  • 7.1.4 删除用户 129
  • 7.1.5 修改用户 130
  • 7.2 使用 Linux 组 132
  • 7.2.1 /etc/group 文件 133
  • 7.2.2 创建新组 133
  • 7.2.3 修改组 134
  • 7.3 理解文件权限 135
  • 7.3.1 使用文件权限符 135
  • 7.3.2 默认文件权限 136
  • 7.4 改变安全性设置 138
  • 7.4.1 改变权限 138
  • 7.4.2 改变所属关系 139
  • 7.5 共享文件 140
  • 7.6 小结 142

第 8 章 管理文件系统 143

  • 8.1 探索 Linux 文件系统 143
  • 8.1.1 基本的 Linux 文件系统 143
  • 8.1.2 日志文件系统 145
  • 8.1.3 写时复制文件系统 147
  • 8.2 操作文件系统 147
  • 8.2.1 创建分区 147
  • 8.2.2 创建文件系统 151
  • 8.2.3 文件系统的检查与修复 153
  • 8.3 逻辑卷管理 154
  • 8.3.1 逻辑卷管理布局 154
  • 8.3.2 Linux 中的 LVM 155
  • 8.3.3 使用 Linux LVM 156
  • 8.4 小结 162

第 9 章 安装软件程序 163

  • 9.1 包管理基础 163
  • 9.2 基于 Debian 的系统 164
  • 9.2.1 用 aptitude 管理软件包 164
  • 9.2.2 用 aptitude 安装软件包 166
  • 9.2.3 用 aptitude 更新软件 168
  • 9.2.4 用 aptitude 卸载软件 169
  • 9.2.5 aptitude 仓库 169
  • 9.3 基于 Red Hat 的系统 171
  • 9.3.1 列出已安装包 171
  • 9.3.2 用 yum 安装软件 173
  • 9.3.3 用 yum 更新软件 174
  • 9.3.4 用 yum 卸载软件 174
  • 9.3.5 处理损坏的包依赖关系 175
  • 9.3.6 yum 软件仓库 176
  • 9.4 从源码安装 177
  • 9.5 小结 180

第 10 章 使用编辑器 181

  • 10.1 vim 编辑器 181
  • 10.1.1 检查 vim 软件包 181
  • 10.1.2 vim 基础 183
  • 10.1.3 编辑数据 185
  • 10.1.4 复制和粘贴 185
  • 10.1.5 查找和替换 186
  • 10.2 nano 编辑器 187
  • 10.3 emacs 编辑器 188
  • 10.3.1 检查 emacs 软件包 189
  • 10.3.2 在控制台中使用 emacs 190
  • 10.3.3 在 GUI 环境中使用 emacs 195
  • 10.4 KDE 系编辑器 196
  • 10.4.1 KWrite 编辑器 196
  • 10.4.2 Kate 编辑器 200
  • 10.5 GNOME 编辑器 202
  • 10.5.1 启动 gedit 203
  • 10.5.2 基本的 gedit 功能 203
  • 10.5.3 设定偏好设置 204
  • 10.6 小结 206

第二部分 shell 脚本编程基础

第 11 章 构建基本脚本 210

  • 11.1 使用多个命令 210
  • 11.2 创建 shell 脚本文件 211
  • 11.3 显示消息 212
  • 11.4 使用变量 214
  • 11.4.1 环境变量 214
  • 11.4.2 用户变量 215
  • 11.4.3 命令替换 216
  • 11.5 重定向输入和输出 218
  • 11.5.1 输出重定向 218
  • 11.5.2 输入重定向 219
  • 11.6 管道 220
  • 11.7 执行数学运算 222
  • 11.7.1 expr 命令 223
  • 11.7.2 使用方括号 224
  • 11.7.3 浮点解决方案 225
  • 11.8 退出脚本 228
  • 11.8.1 查看退出状态码 228
  • 11.8.2 exit 命令 229
  • 11.9 小结 231

第 12 章 使用结构化命令 232

  • 12.1 使用 if-then 语句 232
  • 12.2 if-then-else 语句 235
  • 12.3 嵌套 if 235
  • 12.4 test 命令 238
  • 12.4.1 数值比较 240
  • 12.4.2 字符串比较 242
  • 12.4.3 文件比较 246
  • 12.5 复合条件测试 254
  • 12.6 if-then 的高级特性 255
  • 12.6.1 使用双括号 255
  • 12.6.2 使用双方括号 256
  • 12.7 case 命令 257
  • 12.8 小结 258

第 13 章 更多的结构化命令 260

  • 13.1 for 命令 260
  • 13.1.1 读取列表中的值 261
  • 13.1.2 读取列表中的复杂值 262
  • 13.1.3 从变量读取列表 263
  • 13.1.4 从命令读取值 264
  • 13.1.5 更改字段分隔符 265
  • 13.1.6 用通配符读取目录 266
  • 13.2 C 语言风格的 for 命令 268
  • 13.2.1 C 语言的 for 命令 268
  • 13.2.2 使用多个变量 269
  • 13.3 while 命令 270
  • 13.3.1 while 的基本格式 270
  • 13.3.2 使用多个测试命令 271
  • 13.4 until 命令 272
  • 13.5 嵌套循环 274
  • 13.6 循环处理文件数据 276
  • 13.7 控制循环 277
  • 13.7.1 break 命令 277
  • 13.7.2 continue 命令 280
  • 13.8 处理循环的输出 282
  • 13.9 实例 283
  • 13.9.1 查找可执行文件 284
  • 13.9.2 创建多个用户账户 285
  • 13.10 小结 286

第 14 章 处理用户输入 287

  • 14.1 命令行参数 287
  • 14.1.1 读取参数 287
  • 14.1.2 读取脚本名 289
  • 14.1.3 测试参数 291
  • 14.2 特殊参数变量 292
  • 14.2.1 参数统计 292
  • 14.2.2 抓取所有的数据 294
  • 14.3 移动变量 295
  • 14.4 处理选项 296
  • 14.4.1 查找选项 297
  • 14.4.2 使用 getopt 命令 300
  • 14.4.3 使用更高级的 getopts 302
  • 14.5 将选项标准化 305
  • 14.6 获得用户输入 306
  • 14.6.1 基本的读取 306
  • 14.6.2 超时 307
  • 14.6.3 隐藏方式读取 308
  • 14.6.4 从文件中读取 309
  • 14.7 小结 309

第 15 章 呈现数据 311

  • 15.1 理解输入和输出 311
  • 15.1.1 标准文件描述符 311
  • 15.1.2 重定向错误 313
  • 15.2 在脚本中重定向输出 315
  • 15.2.1 临时重定向 315
  • 15.2.2 永久重定向 316
  • 15.3 在脚本中重定向输入 317
  • 15.4 创建自己的重定向 317
  • 15.4.1 创建输出文件描述符 318
  • 15.4.2 重定向文件描述符 318
  • 15.4.3 创建输入文件描述符 319
  • 15.4.4 创建读写文件描述符 320
  • 15.4.5 关闭文件描述符 321
  • 15.5 列出打开的文件描述符 322
  • 15.6 阻止命令输出 323
  • 15.7 创建临时文件 324
  • 15.7.1 创建本地临时文件 324
  • 15.7.2 在 /tmp 目录创建临时文件 325
  • 15.7.3 创建临时目录 326
  • 15.8 记录消息 327
  • 15.9 实例 328
  • 15.10 小结 330

第 16 章 控制脚本 331

  • 16.1 处理信号 331
  • 16.1.1 重温 Linux 信号 331
  • 16.1.2 生成信号 332
  • 16.1.3 捕获信号 334
  • 16.1.4 捕获脚本退出 335
  • 16.1.5 修改或移除捕获 335
  • 16.2 以后台模式运行脚本 338
  • 16.2.1 后台运行脚本 338
  • 16.2.2 运行多个后台作业 340
  • 16.3 在非控制台下运行脚本 341
  • 16.4 作业控制 342
  • 16.4.1 查看作业 342
  • 16.4.2 重启停止的作业 344
  • 16.5 调整谦让度 345
  • 16.5.1 nice 命令 345
  • 16.5.2 renice 命令 346
  • 16.6 定时运行作业 346
  • 16.6.1 用 at 命令来计划执行作业 347
  • 16.6.2 安排需要定期执行的脚本 349
  • 16.6.3 使用新 shell 启动脚本 352
  • 16.7 小结 353

第三部分 高级 shell 脚本编程

第 17 章 创建函数 356

  • 17.1 基本的脚本函数 356
  • 17.1.1 创建函数 357
  • 17.1.2 使用函数 357
  • 17.2 返回值 359
  • 17.2.1 默认退出状态码 359
  • 17.2.2 使用 return 命令 360
  • 17.2.3 使用函数输出 361
  • 17.3 在函数中使用变量 362
  • 17.3.1 向函数传递参数 362
  • 17.3.2 在函数中处理变量 364
  • 17.4 数组变量和函数 366
  • 17.4.1 向函数传数组参数 366
  • 17.4.2 从函数返回数组 368
  • 17.5 函数递归 369
  • 17.6 创建库 370
  • 17.7 在命令行上使用函数 371
  • 17.7.1 在命令行上创建函数 372
  • 17.7.2 在.bashrc 文件中定义函数 372
  • 17.8 实例 374
  • 17.8.1 下载及安装 374
  • 17.8.2 构建库 374
  • 17.8.3 shtool 库函数 376
  • 17.8.4 使用库 376
  • 17.9 小结 377

第 18 章 图形化桌面环境中的脚本编程 378

  • 18.1 创建文本菜单 378
  • 18.1.1 创建菜单布局 379
  • 18.1.2 创建菜单函数 380
  • 18.1.3 添加菜单逻辑 380
  • 18.1.4 整合 shell 脚本菜单 381
  • 18.1.5 使用 select 命令 382
  • 18.2 制作窗口 384
  • 18.2.1 dialog 包 384
  • 18.2.2 dialog 选项 389
  • 18.2.3 在脚本中使用 dialog 命令 391
  • 18.3 使用图形 393
  • 18.3.1 KDE 环境 393
  • 18.3.2 GNOME 环境 396
  • 18.4 小结 400

第 19 章 初识 sed 和 gawk 401

  • 19.1 文本处理 401
  • 19.1.1 sed 编辑器 401
  • 19.1.2 gawk 程序 404
  • 19.2 sed 编辑器基础 410
  • 19.2.1 更多的替换选项 410
  • 19.2.2 使用地址 411
  • 19.2.3 删除行 414
  • 19.2.4 插入和附加文本 415
  • 19.2.5 修改行 417
  • 19.2.6 转换命令 418
  • 19.2.7 回顾打印 419
  • 19.2.8 使用 sed 处理文件 421
  • 19.3 小结 423

第 20 章 正则表达式 424

  • 20.1 什么是正则表达式 424
  • 20.1.1 定义 424
  • 20.1.2 正则表达式的类型 425
  • 20.2 定义 BRE 模式 426
  • 20.2.1 纯文本 426
  • 20.2.2 特殊字符 427
  • 20.2.3 锚字符 428
  • 20.2.4 点号字符 430
  • 20.2.5 字符组 430
  • 20.2.6 排除型字符组 432
  • 20.2.7 区间 433
  • 20.2.8 特殊的字符组 434
  • 20.2.9 星号 434
  • 20.3 扩展正则表达式 436
  • 20.3.1 问号 436
  • 20.3.2 加号 437
  • 20.3.3 使用花括号 437
  • 20.3.4 管道符号 438
  • 20.3.5 表达式分组 439
  • 20.4 正则表达式实战 439
  • 20.4.1 目录文件计数 440
  • 20.4.2 验证电话号码 441
  • 20.4.3 解析邮件地址 443
  • 20.5 小结 444

第 21 章 sed 进阶 445

  • 21.1 多行命令 445
  • 21.1.1 next 命令 446
  • 21.1.2 多行删除命令 449
  • 21.1.3 多行打印命令 449
  • 21.2 保持空间 450
  • 21.3 排除命令 451
  • 21.4 改变流 454
  • 21.4.1 分支 454
  • 21.4.2 测试 455
  • 21.5 模式替代 456
  • 21.5.1 & 符号 457
  • 21.5.2 替代单独的单词 457
  • 21.6 在脚本中使用 sed 458
  • 21.6.1 使用包装脚本 458
  • 21.6.2 重定向 sed 的输出 459
  • 21.7 创建 sed 实用工具 460
  • 21.7.1 加倍行间距 460
  • 21.7.2 对可能含有空白行的文件加倍行间距 460
  • 21.7.3 给文件中的行编号 461
  • 21.7.4 打印末尾行 462
  • 21.7.5 删除行 463
  • 21.7.6 删除 HTML 标签 466
  • 21.8 小结 467

第 22 章 gawk 进阶 469

  • 22.1 使用变量 469
  • 22.1.1 内建变量 469
  • 22.1.2 自定义变量 474
  • 22.2 处理数组 476
  • 22.2.1 定义数组变量 476
  • 22.2.2 遍历数组变量 477
  • 22.2.3 删除数组变量 478
  • 22.3 使用模式 478
  • 22.3.1 正则表达式 478
  • 22.3.2 匹配操作符 479
  • 22.3.3 数学表达式 480
  • 22.4 结构化命令 480
  • 22.4.1 if 语句 480
  • 22.4.2 while 语句 482
  • 22.4.3 do-while 语句 483
  • 22.4.4 for 语句 484
  • 22.5 格式化打印 484
  • 22.6 内建函数 487
  • 22.6.1 数学函数 487
  • 22.6.2 字符串函数 488
  • 22.6.3 时间函数 490
  • 22.7 自定义函数 490
  • 22.7.1 定义函数 490
  • 22.7.2 使用自定义函数 491
  • 22.7.3 创建函数库 491
  • 22.8 实例 492
  • 22.9 小结 493

第 23 章 使用其他 shell 495

  • 23.1 什么是 dash shell 495
  • 23.2 dash shell 的特性 496
  • 23.2.1 dash 命令行参数 496
  • 23.2.2 dash 环境变量 497
  • 23.2.3 dash 内建命令 499
  • 23.3 dash 脚本编程 500
  • 23.3.1 创建 dash 脚本 500
  • 23.3.2 不能使用的功能 500
  • 23.4 zsh shell 502
  • 23.5 zsh shell 的组成 503
  • 23.5.1 shell 选项 503
  • 23.5.2 内建命令 504
  • 23.6 zsh 脚本编程 508
  • 23.6.1 数学运算 508
  • 23.6.2 结构化命令 509
  • 23.6.3 函数 510
  • 23.7 小结 510

第四部分 创建实用的脚本

第 24 章 编写简单的脚本实用工具 514

  • 24.1 归档 514
  • 24.2 管理用户账户 523
  • 24.2.1 需要的功能 523
  • 24.2.2 创建脚本 530
  • 24.2.3 运行脚本 535
  • 24.3 监测磁盘空间 537
  • 24.3.1 需要的功能 537
  • 24.3.2 创建脚本 540
  • 24.3.3 运行脚本 541
  • 24.4 小结 542

第 25 章 创建与数据库、Web 及电子邮件相关的脚本 543

  • 25.1 MySQL 数据库 543
  • 25.1.1 使用 MySQL 543
  • 25.1.2 在脚本中使用数据库 552
  • 25.2 使用 Web 555
  • 25.2.1 安装 Lynx 556
  • 25.2.2 lynx 命令行 557
  • 25.2.3 Lynx 配置文件 558
  • 25.2.4 从 Lynx 中获取数据 559
  • 25.3 使用电子邮件 561
  • 25.4 小结 564

第 26 章 一些小有意思的脚本 565

  • 26.1 发送消息 565
  • 26.1.1 功能分析 565
  • 26.1.2 创建脚本 568
  • 26.2 获取格言 573
  • 26.2.1 功能分析 574
  • 26.2.2 创建脚本 577
  • 26.3 编造借口 583
  • 26.3.1 功能分析 583
  • 26.3.2 创建脚本 586
  • 26.4 小结 587
  • 附录 A bash 命令快速指南 589
  • 附录 B sed 和 gawk 快速指南 597

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了