Linux命令行与shell脚本编程大全.第3版 - 图1

引 言

欢迎阅读《Linux命令行与shell脚本编程大全(第3版)》。和所有“大全”系列图书一样,本书涵盖了详尽的动手教程和实践信息,还提供了与所学内容相关的参考信息和背景资料。本书是关于Linux命令行和shell命令的相当全面的资源。读完之后,你将可以轻松写出自己的shell脚本来实现Linux系统任务自动化处理。

读者对象

如果你是Linux环境下的系统管理员,那么学会编写shell脚本将让你受益匪浅。本书并未细述安装Linux系统的每个步骤,但只要系统已安装好Linux并能运行起来,你就可以开始考虑如何让一些日常的系统管理任务实现自动化。这时shell脚本编程就能发挥作用了,这也正是本书的作用所在。本书将演示如何使用shell脚本来自动处理系统管理任务,包括从监测系统统计数据和数据文件到为你的老板生成报表。
如果你是家用Linux爱好者,同样能从本书中获益。现今,用户很容易在诸多部件堆积而成的图形环境中迷失。大多数桌面Linux发行版都尽量向一般用户隐藏系统的内部细节。但有时你确实需要知道内部发生了什么。本书将告诉你如何启动Linux命令行以及接下来要做什么。通常, 如果是执行一些简单任务(比如文件管理),在命令行下操作要比在华丽的图形界面下方便得多。在命令行下有大量的命令可供使用,本书将会展示如何使用它们。

本书结构

本书将会引领你从认识Linux命令行基础开始,一直到写出自己的shell脚本。全书分成四大部分,每部分都基于前面的内容。
第一部分假定你已经有个能运行的Linux系统,或者正在设法获取Linux系统。第1章“初识Linux shell”,描述了构成整个Linux系统的各个部分,并且说明了shell是如何融入Linux的。在介绍了Linux系统的基础知识之后,接着继续探讨以下内容:

  • 使用终端仿真包来访问shell(第2章);
  • 介绍基本的shell命令(第3章);
  • 使用更高级的shell命令来窥探系统信息(第4章);
  • 理解shell的用途(第5章);
  • 使用shell变量来操作数据(第6章);
  • 理解Linux文件系统和安全(第7章);
  • 在命令行上使用Linux文件系统(第8章);
  • 在命令行上安装和更新软件(第9章);
  • 使用Linux编辑器编写shell脚本(第10章)。

第二部分将从编写shell脚本开始,具体内容如下:

  • 学习如何创建和运行shell脚本(第11章);
  • 改变shell脚本中程序的流程(第12章);
  • 迭代代码片段(第13章);
  • 在脚本中处理用户输入的数据(第14章);
  • 了解在脚本中存储和显示数据的不同方法(第15章);
  • 控制脚本在系统中运行的方式和时机(第16章)。

第三部分深入探讨了shell脚本编程的更高级话题,其中包括:

  • 在脚本中创建自己的函数(第17章);
  • 利用Linux图形化桌面来和脚本用户交互(第18章);
  • 使用高级Linux命令过滤和解析数据文件(第19章);
  • 使用正则表达式来定义数据(第20章);
  • 学习在脚本中操作数据的高级方法(第21章);
  • 从原始数据生成报表(第22章);
  • 修改shell脚本,使其能在其他Linux shell中运行(第23章)。

本书的第四部分演示了如何在现实环境中使用shell脚本。在这部分,你将:

  • 学习如何将各种脚本特性融入自己的脚本中(第24章);
  • 学习如何使用数据库保存、检索数据,如何访问互联网上的数据以及发送电子邮件(第25章);
  • 编写与Linux系统交互的高级脚本(第26章)。

警告、窍门与说明

为帮助读者更好地理解本书内容,全书进行了很多不同的组织和排版上的处理。
警告 这部分信息很重要,所以放在单独的段落里,并采用了特殊的排版。“警告”部分介绍了要特别注意的信息,不管是不便之处,还是对数据和系统潜在的危害,都囊括在内。
窍门 这部分提供了有益的建议,能够简化你的操作,提升工作效率。“窍门”部分也会提出可行的问题解决方案或某项任务更好的处理方法。
说明 这部分提供了有用的补充或辅助信息,不过有些偏离当前讲述的主题。

代码下载

可以从http://www.wiley.com/go/linuxcommandline下载本书的代码文件

最低需求

本书并不局限于某种特定的Linux发行版,你可以使用任何可用的Linux系统来跟着书中的进度学习。书中大部分内容都采用了bash shell,这是多数Linux系统的默认shell。

下一步做什么

读完本书之后,你就已经可以在日常工作中得心应手地运用Linux命令了。在不断变化的Linux世界,我们最好能不断了解Linux的最新发展。Linux发行版会有变动,增加新的功能,移除过时的功能。经常关注Linux方面的资讯,不断更新你的Linux知识体系。找一个不错的Linux论坛, 关注一下Linux世界的最新动态。有很多流行的Linux新闻站点都能提供有关Linux新进展的及时资讯,比如Slashdot和Distrowatch。

致 谢

首先,所有的荣誉和赞美都献给上帝。是他通过他的儿子耶稣,让这一切成为可能,并赐予我们永生。
非常感谢John Wiley & Sons出版团队的诸位为本书作出的突出贡献。感谢前组稿编辑Mary James为我们提供写作本书的机会。感谢策划编辑Brian Herrmann保证本书的写作顺利进行,并将内容更好地呈现给读者。感谢Marty的努力和勤勉。本书的技术编辑Kevin E. Ryan为保证本书的内容正确作出了卓越贡献,并对本书内容提出了若干改进建议。感谢本书的文字编辑Gwenette Gaddis,她的耐心和努力使得本书的可读性更强。还要感谢Waterside Productions公司的Carole McClendon为我们安排本书的写作事务,并在写作道路上给予了我们很大的帮助。
在此,Christine还想感谢她的先生Timothy,感谢他的鼓励、耐心和倾听,即使他并不理解她说的是什么,也能全心支持她。

目 录

第一部分 Linux 命令行

第1 章 初识Linux shell

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

第2 章 走进shell

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

第3 章 基本的bash shell 命令

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

第4 章 更多的bash shell 命令

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

第5 章 理解shell

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

第6 章 使用Linux 环境变量

6.1 什么是环境变量
6.1.1 全局环境变量
6.1.2 局部环境变量
6.2 设置用户定义变量
6.2.1 设置局部用户定义变量
6.2.2 设置全局环境变量
6.3 删除环境变量
6.4 默认的shell 环境变量
6.5 设置PATH 环境变量
6.6 定位系统环境变量
6.6.1 登录shell
6.6.2 交互式shell 进程
6.6.3 非交互式shell
6.6.4 环境变量持久化
6.7 数组变量
6.8 小结

第7 章 理解Linux 文件权限

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

第8 章 管理文件系统

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

第9 章 安装软件程序 . 163

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

第10 章 使用编辑器

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

第二部分 shell 脚本编程基础

第11 章 构建基本脚本

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

第12 章 使用结构化命令

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

第13 章 更多的结构化命令

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

第14 章 处理用户输入

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

第15 章 呈现数据

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

第16 章 控制脚本

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

第三部分 高级shell 脚本编程

第17 章 创建函数

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

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

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

第19 章 初识sed 和gawk

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

第20 章 正则表达式

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

第21 章 sed 进阶

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

第22 章 gawk 进阶

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

第23 章 使用其他shell

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

第四部分 创建实用的脚本

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

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

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

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

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

26.1 发送消息
26.1.1 功能分析
26.1.2 创建脚本
26.2 获取格言
26.2.1 功能分析
26.2.2 创建脚本
26.3 编造借口
26.3.1 功能分析
26.3.2 创建脚本
26.4 小结

附录A bash 命令快速指南

附录B sed 和gawk 快速指南