《Linux命令行大全》第2版是一本什么样的书
这是一本全面讲述Linux命令行用法的图书。本书从更广泛的意义上向你传授如何使用CLI、CLI工作原理、CLI都有哪些功能,以及最佳实践是什么。
这不是一本有关Linux操作系统管理的图书。任何关于命令行的严肃讨论都会不可避免地转向操作系统管理方面的话题,本书仅触及少数管理问题。为了让你能开展后续的学习,本书提供了坚实的命令行基础知识,这可是完成重要的系统管理任务必不可少的工具。
本书以Linux为中心,只讨论当前的Linux发行版。尽管本书95%的内容对其他类UNIX系统用户也有帮助,但本书主要还是面向目前的Linux命令行用户。
第2版中的新内容
尽管基本结构和内容保持不变,但第2版其实做了各种改善、更新,并与时俱进,其中有很多是基于读者的反馈。除此之外,还有两处特别的改进。首先,本书现在假定使用Bash 4.x,该版本在初稿时并未广泛使用。Bash的4.x版添加了一些新特性,我们自然不会错过。其次,对本书第四部分进行了更新,提供了更好的脚本实践示例。第四部分中包含的脚本已经做出了修订,以使其更加稳健,同时我还修复了其中的几处错误。
为什么使用命令行
你有没有注意到,电影里的“超级黑客”(就是那些用不了半分钟就能侵入极为安全的计算机的人)端坐在计算机前时,从来都没碰过鼠标?这是因为制片人清楚,作为人类,我们从本能上就知道,要想在计算机上真正“搞定一切”的方式就是通过键盘输入命令!
如今的大多数计算机用户只熟悉图形用户界面(Graphical User Interface,GUI),甚至少数厂商和专家说命令行界面(Command Line Interface,CLI)是过去的玩意儿。这真遗憾,良好的CLI是一种极富表达力的人机交互方式,就像人们之间的书信交流一样。“GUI使简单的任务更简单,而CLI使完成艰难的任务成为可能。”这句话放到今天仍然正确。
由于Linux操作系统参照了UNIX系列操作系统,因此分享了UNIX丰富的命令行工具。UNIX操作系统在20世纪80年代早期就占据了主流地位(尽管它在20世纪70年代才被开发出来),GUI在当时尚未被广泛采用,因此诞生了大量的CLI。事实上,Linux的早期实践者选择Linux而非Windows NT的主要原因之一就是,其强大的CLI使“完成艰难的任务成为可能”。
学习本书的你
本书适合从其他操作系统转向Linux的新用户。你很可能曾是某一版Windows的“高手”;也可能是老板让你去管理Linux服务器,或是自己走进了像树莓派这样的单板计算机(Single Board Computer,SBC)的神奇新世界;又或者是厌烦了各种安全问题的桌面用户,想要体验Linux操作系统。这都无妨,欢迎阅读。
话虽如此,但万事开头难,学习命令行也不例外。学习命令行是一项挑战,需要付出辛勤的汗水。这倒不是说它有多难,而是它涵盖的内容着实广泛。在普通的Linux操作系统中,能够在命令行上使用的程序数以千计,这毫不夸张。先提醒你自己,学习命令行可不是件容易的事。
然而,学习Linux命令行所带来的回报颇丰。如果你觉得自己是“高手”,那么先等一等吧。你对真正的“力量”还一无所知。而且,不考虑其他的计算机技能,命令行知识是经久不衰的。你今天学到的知识在10年后仍旧管用。命令行知识经受得住时间的考验。
如果你没有编程经验,也不用担心,依然可以从本书开始学起。
《Linux命令行大全》第2版内容结构
本书的内容经过精心编排,阅读时你会感觉就像有一位老师坐在身旁手把手地指导你。许多作者可能采用系统化的方法来讲解书中的内容。从我的角度来讲,这很合理,但是对初学者而言,可能会让人摸不着头脑。
本书的另一个目标是让你熟悉UNIX的思考方式,它不同于Windows的思考方式。在此过程中,我们还会帮助你理解命令行的工作原理和方式。Linux不仅仅是一个软件,还是庞大的UNIX文化中的一小部分,有自己的语言和历史。
本书包括4个部分,每一部分都涵盖了命令行不同方面的知识。
· 第一部分:学习Shell。这部分开启命令行基础知识的学习之旅,包括命令结构、浏览文件系统、编辑命令行以及查找命令帮助和文档。
· 第二部分:配置与环境。这部分讲述编辑配置文件,如何通过命令行的方式控制计算机操作。
· 第三部分:常见任务与必备工具。这部分探讨很多在命令行上执行的常规任务。类UNIX系统,例如Linux,包含大量“经典的”命令行程序,可用于对数据执行强有力的操作。
· 第四部分:编写Shell脚本。这部分介绍Shell编程,它是一项公认的基础技术,但并不难学,很多常见计算任务能借助其实现自动化。通过学习Shell编程,你会熟悉一些同样能够应用于其他编程语言中的概念。
学习之前你需要的预备知识
为了阅读本书,你只需要安装好Linux操作系统。可以通过下列任意一种方式实现。
在计算机(不用是最新的)上安装Linux。无论选择哪个Linux发行版都没有问题,不过大多数人会从Ubuntu、Fedora、OpenSUSE中选择。如果你拿不准,就先试一试Ubuntu。安装现代Linux发行版时,由于硬件配置不同,要么简单至极,要么难得令人发指。建议采用近两年的桌面计算机,至少配备2GB的内存和6GB的空闲磁盘空间。尽可能避免使用笔记本计算机和无线网络,因为这二者经常难以正常工作。
使用LiveCD或U盘。许多Linux发行版有一个挺酷的功能,你可以直接通过CD-ROM或U盘运行Linux,完全不用安装。只需进入BIOS设置界面,将计算机设为从CD-ROM或USB设备启动,然后重启即可。使用这种方法可以在安装之前很好地测试硬件兼容性。缺点在于相较于在硬盘上安装的Linux,运行速度会比较慢。Ubuntu和Fedora(以及其他发行版)都有LiveCD版本。
不管你用哪种方式安装Linux,都会偶尔需要超级用户(也就是管理员)权限来完成本书中的某些任务。
安装好之后,就可以边读边练习了。本书的大部分内容需要你“亲自动手”学习。
为什么没有采用“GNU/Linux”的称谓
在某些群体中,将Linux操作系统称为“GNU/Linux操作系统”。其实不存在哪种称呼“Linux”的方式完全正确,因为它是由遍布世界各地的开发人员共同造就的。从技术层面来讲,Linux只是操作系统内核的名称,仅此而已。内核自然非常重要,没有它,操作系统就无法运转,但是它并不足以构成一个完整的操作系统。理查德·马修·斯托曼是一位“天才哲学家”。他发起自由软件运动,成立了自由软件基金会,创建了自由软件项目并编写了GNU C语言编译器(GCC)的第一个版本,还制定了GNU通用公共许可证(GNU General Public License,GPL)等。他坚持将Linux称为“GNU/LINUX”,目的是准确地反映GNU项目对Linux操作系统做出的贡献。尽管GNU项目先于Linux内核出现,其贡献有目共睹,不容忽视。但是将GNU也加入名称中,对其他为Linux操作系统的发展做出巨大贡献的人来说是不公平的。除此之外,由于Linux内核先于其他程序启动,因此我觉得“Linux/GNU”这个名称在技术上更为准确。
在目前流行的名称中,“Linux”指代的是内核和在典型的Linux发行版中出现的所有其他自由和开源软件,也就是整个Linux生态环境,而不仅仅是GNU的组成部分。操作系统市场似乎偏好单个词的名称,例如DOS、Windows、macOS、Solaris、Irix、AIX。我也选择使用这个名称。但如果你更喜欢“GNU/Linux”,那么阅读时请在脑海中执行“查找—替换”操作。
详细目录
-
第一部分
学习Shell
-
-
第1章
什么是Shell
3
-
1.1
终端仿真器
3
-
1.2
小试牛刀
4
-
1.2
.1
命令历史
4
-
1.2
.2
光标移动
4
-
1.3
几个简单的命令
5
-
1.4
结束终端会话
6
-
1.5
总结
6
-
第2章
导航
7
-
2.1
理解文件系统树
7
-
2.2
当前工作目录
8
-
2.3
列出目录内容
8
-
2.4
更改当前工作目录
9
-
2.4
.1
绝对路径名
9
-
2.4
.2
相对路径名
9
-
2.4
.3
一些有用的便捷写法
11
-
2.5
总结
11
-
第3章
探索Linux系统
12
-
3.1
使用ls命令之乐
12
-
3.1
.1
选项与参数
13
-
3.1
.2
进一步了解长格式
14
-
3.2
使用file命令确定文件类型
15
-
3.3
使用less命令查看文本文件
15
-
3.4
按图索骥
17
-
3.5
符号链接
19
-
3.6
硬链接
20
-
3.7
总结
20
-
第4章
操作文件和目录
21
-
4.1
通配符
22
-
4.2
mkdir——创建目录
24
-
4.3
cp——复制文件和目录
24
-
4.4
mv——移动和重命名文件
25
-
4.5
rm——删除文件和目录
26
-
4.6
ln——创建硬链接和符号链接
27
-
4.6
.1
硬链接
27
-
4.6
.2
符号链接
28
-
4.7
实战演练
28
-
4.7
.1
创建目录
28
-
4.7
.2
复制文件
29
-
4.7
.3
移动和重命名文件
29
-
4.7
.4
创建硬链接
30
-
4.7
.5
创建符号链接
31
-
4.7
.6
删除文件和目录
32
-
4.8
总结
34
-
第5章
和命令打交道
35
-
5.1
命令究竟是什么
35
-
5.2
识别命令
36
-
5.2
.1
type—显示命令类型
36
-
5.2
.2
which—显示可执行
-
文件的位置
36
-
5.3
获取命令文档
37
-
5.3
.1
help—获取Shell内建
-
命令的帮助信息
37
-
5.3
.2
--help—显示用法信息
38
-
5.3
.3
man—显示命令的
-
手册页
38
-
5.3
.4
apropos—显示适合的
-
命令清单
40
-
5.3
.5
whatis—显示手册页的
-
简述
40
-
5.3
.6
info—显示程序的info
-
条目
41
-
5.3
.7
文档文件
42
-
5.4
使用alias创建自己的命令
42
-
5.5
总结
44
-
第6章
重定向
45
-
6.1
标准输入、标准输出及
-
标准错误
45
-
6.2
标准输出重定向
46
-
6.3
标准错误重定向
47
-
6.3
.1
将标准输出和标准错误
-
重定向到同一个文件中
48
-
6.3
.2
丢弃用不着的输出结果
48
-
6.4
标准输入重定向
49
-
6.5
管道
50
-
6.5
.1
排序列表
51
-
6.5
.2
uniq—报告或忽略
-
重复行
52
-
6.5
.3
wc—统计文件中换行符、
-
单词以及字节的数量
52
-
6.5
.4
grep—输出与模式
-
匹配的行
53
-
6.5
.5
head/tail—输出文件的
-
开头/结尾部分
53
-
6.5
.6
tee—读取标准输入
-
并将输出结果写入
-
标准输出和文件
54
-
6.6
总结
55
-
第7章
“Shell眼”看世界
56
-
7.1
扩展
56
-
7.1
.1
路径名扩展
57
-
7.1
.2
浪纹线扩展
58
-
7.1
.3
算术扩展
59
-
7.1
.4
花括号扩展
60
-
7.1
.5
参数扩展
61
-
7.1
.6
命令替换
61
-
7.2
引用
62
-
7.2
.1
双引号
62
-
7.2
.2
单引号
64
-
7.2
.3
转义字符
64
-
7.2
.4
反斜线转义序列
65
-
7.3
总结
65
-
第8章
高级键盘技巧
66
-
8.1
编辑命令行
66
-
8.1
.1
光标移动
67
-
8.1
.2
修改文本
67
-
8.1
.3
剪切和粘贴文本
67
-
8.2
补全功能
68
-
8.3
命令历史记录
70
-
8.3
.1
搜索历史记录
70
-
8.3
.2
历史扩展
71
-
8.4
总结
72
-
第9章
权限
73
-
9.1
属主、属组以及其他用户
74
-
9.2
读取、写入和执行
75
-
9.2
.1
chmod—修改文件
-
模式
76
-
9.2
.2
使用GUI设置文件模式
79
-
9.2
.3
umask—设置默认权限
79
-
9.2
.4
一些特殊的权限
80
-
9.3
改变用户身份
81
-
9.3
.1
su—以其他用户身份
-
启动Shell
82
-
9.3
.2
sudo—以其他用户身份执行命令
83
-
9.3
.3
chown—更改文件属主和
-
属组
84
-
9.3
.4
chgrp—更改文件属组
85
-
9.4
行使权限
85
-
9.5
修改密码
87
-
9.6
总结
88
-
第10章
进程
89
-
10.1
进程的工作方式
90
-
10.2
查看进程
90
-
10.3
进程控制
94
-
10.3
.1
中断进程
94
-
10.3
.2
将进程置于后台
95
-
10.3
.3
使进程返回前台
95
-
10.3
.4
停止进程
96
-
10.4
信号
96
-
10.4
.1
使用kill命令向进程发送
-
信号
97
-
10.4
.2
使用killall命令向多个
-
进程发送信号
98
-
10.5
关闭系统
99
-
10.6
更多与进程相关的命令
99
-
10.7
总结
100
-
-
第二部分
配置与环境
-
-
第11章
环境
103
-
11.1
环境中都保存了什么
103
-
11.1
.1
检查环境
104
-
11.1
.2
一些值得注意的环境
-
变量
105
-
11.2
如何建立环境
106
-
11.3
修改环境
108
-
11.3
.1
应该修改哪些文件
108
-
11.3
.2
文本编辑器
109
-
11.3
.3
使用文本编辑器
109
-
11.3
.4
使改动生效
112
-
11.4
总结
112
-
第12章
Vi入门
113
-
12.1
为什么要学习Vi
113
-
12.2
背景知识
114
-
12.3
启动和退出Vi
114
-
12.4
编辑模式
116
-
12.4
.1
进入插入模式
116
-
12.4
.2
保存文件
117
-
12.5
光标移动
117
-
12.6
基本编辑
118
-
12.6
.1
追加
118
-
12.6
.2
新建
119
-
12.6
.3
删除
120
-
12.6
.4
剪切、复制及粘贴
121
-
12.6
.5
合并
122
-
12.7
搜索和替换
122
-
12.7
.1
行内搜索
122
-
12.7
.2
搜索整个文件
122
-
12.7
.3
全局搜索和替换
123
-
12.8
编辑多个文件
124
-
12.8
.1
在文件之间切换
125
-
12.8
.2
载入更多的文件进行
-
编辑
125
-
12.8
.3
将一个文件的内容复制到
-
另一个文件
126
-
12.8
.4
将整个文件插入另一个
-
文件
127
-
12.9
保存工作
128
-
12.10
总结
128
-
第13章
定制提示符
129
-
13.1
分解提示符
129
-
13.2
换一种提示符
131
-
13.3
增加颜色
132
-
13.4
移动光标
134
-
13.5
保存提示符
135
-
13.6
总结
135
-
-
第三部分
常见任务与必备工具
-
-
第14章
软件包管理
139
-
14.1
打包系统
140
-
14.2
软件包的工作方式
140
-
14.2
.1
软件包文件
140
-
14.2
.2
仓库
141
-
14.2
.3
依赖性
141
-
14.2
.4
低层和高层工具
141
-
14.3
常见的软件包管理任务
142
-
14.3
.1
在仓库中查找软件包
142
-
14.3
.2
安装仓库中的软件包
142
-
14.3
.3
安装软件包文件中的
-
软件包
142
-
14.3
.4
删除软件包
143
-
14.3
.5
通过仓库更新软件包
143
-
14.3
.6
通过软件包文件更新
-
软件包
144
-
14.3
.7
列举已安装的软件包
144
-
14.3
.8
确定软件包是否已安装
144
-
14.3
.9
显示已安装软件包的
-
相关信息
145
-
14.3
.10
识别某个文件是哪个
-
软件包安装的
145
-
14.4
总结
145
-
第15章
存储介质
147
-
15.1
存储设备的挂载与卸载
148
-
15.1
.1
查看已挂载的文件系统
-
列表
149
-
15.1
.2
确定设备名称
152
-
15.2
创建新文件系统
154
-
15.2
.1
用fdisk操作分区
154
-
15.2
.2
使用mkfs创建新的文件
-
系统
156
-
15.3
文件系统的检查和修复
157
-
15.4
在设备之间直接移动数据
158
-
15.4
.1
向可刻录CD写入数据
159
-
15.4
.2
创建CD-ROM的ISO
-
映像文件
159
-
15.4
.3
用文件集合创建ISO
-
映像文件
159
-
15.5
写入CD-ROM的ISO映像
-
文件
160
-
15.5
.1
直接挂载ISO映像
-
文件
160
-
15.5
.2
擦除可刻录CD
161
-
15.5
.3
刻录映像文件
161
-
15.6
总结
161
-
第16章
联网
162
-
16.1
网络检查与监控
163
-
16.1
.1
ping
163
-
16.1
.2
traceroute
164
-
16.1
.3
ip
165
-
16.1
.4
netstat
165
-
16.2
通过网络传输文件
166
-
16.2
.1
ftp
167
-
16.2
.2
lftp——更好的ftp
168
-
16.2
.3
wget
168
-
16.3
与远程主机的安全通信
169
-
16.3
.1
ssh
169
-
16.3
.2
scp与sftp
172
-
16.4
总结
173
-
第17章
查找文件
174
-
17.1
locate——简单的文件查找
-
方法
174
-
17.2
find——复杂的文件查找
-
方法
176
-
17.2
.1
测试条件
176
-
17.2
.2
操作符
178
-
17.2
.3
预定义操作
180
-
17.2
.4
用户自定义操作
182
-
17.2
.5
提高效率
182
-
17.2
.6
xargs
183
-
17.2
.7
实战演练
184
-
17.2
.8
find命令选项
185
-
17.3
总结
186
-
第18章
归档与备份
187
-
18.1
压缩文件
187
-
18.1
.1
gzip
188
-
18.1
.2
bzip2
190
-
18.2
文件归档
191
-
18.2
.1
tar
191
-
18.2
.2
zip
195
-
18.3
同步文件与目录
196
-
18.4
总结
199
-
第19章
正则表达式
200
-
19.1
什么是正则表达式
200
-
19.2
grep
201
-
19.3
元字符与文字字符
202
-
19.4
任意字符
203
-
19.5
锚点
203
-
19.6
方括号表达式与字符类
204
-
19.6
.1
排除
205
-
19.6
.2
传统的字符范围
205
-
19.7
POSIX字符类
206
-
19.8
POSIX基本型正则表达式与
-
扩展型正则表达式
209
-
19.9
多选结构
210
-
19.10
量词
211
-
19.10
.1
?——匹配0次或1次
211
-
19.10
.2
*——匹配0次或多次
212
-
19.10
.3
+——匹配1次或多次
212
-
19.10
.4 {}
——匹配指定次数
213
-
19.11
实战演练
213
-
19.11
.1
使用grep验证电话号码
-
列表
213
-
19.11
.2
使用find查找路径名
214
-
19.11
.3
使用locate搜索文件
215
-
19.11
.4
使用Less和Vim搜索
-
文本
215
-
19.12
总结
217
-
第20章
文本处理
218
-
20.1
文本的应用
219
-
20.1
.1
文档
219
-
20.1
.2
网页
219
-
20.1
.3
电子邮件
219
-
20.1
.4
打印机输出
219
-
20.1
.5
程序源代码
219
-
20.2
温故知新
220
-
20.2
.1
cat—连接文件并
-
打印
220
-
20.2
.2
sort—排序
221
-
20.2
.3
uniq—删除重复行
227
-
20.3
切片和切块
228
-
20.3
.1
cut——从每行中删除
-
部分内容
229
-
20.3
.2
paste——合并行
231
-
20.3
.3
join——连接两个文件中
-
具有公共字段的行
233
-
20.4
比较文本
235
-
20.4
.1
comm——逐行比较两个
-
已排序的文件
235
-
20.4
.2
diff——逐行比较文件
236
-
20.4
.3
patch——对原文件应用
-
diff文件
238
-
20.5
即时编辑
239
-
20.5
.1
tr——转写或删除字符
239
-
20.5
.2
sed——用于文本过滤和
-
转换的流编辑器
240
-
20.5
.3
aspell——交互式拼写
-
检查器
247
-
20.6
总结
250
-
第21章
格式化输出
251
-
21.1
简单的格式化工具
251
-
21.1
.1
nl——对行进行编号
252
-
21.1
.2
fold——在指定长度处
-
折行
254
-
21.1
.3
fmt——一个简单的文本
-
格式化工具
255
-
21.1
.4
pr——格式化要输出的
-
文本
258
-
21.1
.5
printf——格式化并输出
-
数据
259
-
21.2
文档格式化系统
261
-
21.3
总结
267
-
第22章
打印
268
-
22.1
打印简史
268
-
22.1
.1
“黑暗”时代
269
-
22.1
.2
基于字符的打印机
269
-
22.1
.3
图形化打印机
270
-
22.2
Linux的打印功能
271
-
22.3
准备文件打印
271
-
22.4
将打印作业发送至打印机
272
-
22.4
.1
lpr—以Berkeley风格
-
打印文件
272
-
22.4
.2
lp—以System
V风格
-
打印文件
273
-
22.4
.3
a2ps—在PostScript
-
打印机上打印文件
274
-
22.5
监控打印作业
276
-
22.5
.1
lpstat——显示打印系统
-
状态
276
-
22.5
.2
lpq——显示打印队列
-
状态
277
-
22.5
.3
lprm/cancel——取消打印
-
作业
278
-
22.6
总结
278
-
第23章
编译程序
279
-
23.1
什么是编译
280
-
23.2
编译C程序
281
-
23.2
.1
获取源代码
281
-
23.2
.2
检查源代码树
283
-
23.2
.3
构建程序
284
-
23.2
.4
安装程序
288
-
23.3
总结
288
-
-
第四部分
编写Shell脚本
-
-
第24章
编写第一个脚本
291
-
24.1
什么是Shell脚本
291
-
24.2
如何创建并执行Shell脚本
292
-
24.2
.1
脚本文件格式
292
-
24.2
.2
可执行权限
293
-
24.2
.3
脚本位置
293
-
24.2
.4
脚本的理想位置
294
-
24.3
更多的格式技巧
294
-
24.3
.1
长选项
295
-
24.3
.2
缩进与续行
295
-
24.4
总结
296
-
第25章
启动项目
297
-
25.1
第一阶段:最小化文档
297
-
25.2
第二阶段:添加数据
299
-
25.3
变量与常量
300
-
25.3
.1
为变量与常量赋值
302
-
25.3
.2
here
document
304
-
25.4
总结
306
-
第26章
自顶向下设计
307
-
26.1
Shell函数
308
-
26.2
局部变量
311
-
26.3
保持脚本执行
312
-
26.4
总结
315
-
第27章
流程控制:if分支
316
-
27.1
if语句
317
-
27.2
退出状态
317
-
27.3
使用test
319
-
27.3
.1
文件表达式
319
-
27.3
.2
字符串表达式
322
-
27.3
.3
整数表达式
323
-
27.4
更现代的test
324
-
27.5
(())——为整数设计
325
-
27.6
组合表达式
326
-
27.7
控制操作符:另一种分支
-
方式
329
-
27.8
总结
329
-
第28章
读取键盘输入
331
-
28.1
read——从标准输入读取值
332
-
28.1
.1
选项
334
-
28.1
.2
IFS
336
-
28.2
验证输入
338
-
28.3
菜单
339
-
28.4
总结
341
-
第29章
流程控制:while/until循环
342
-
29.1
循环
342
-
29.2
跳出循环
345
-
29.3
使用循环读取文件
347
-
29.4
总结
348
-
第30章
故障诊断
349
-
30.1
语法错误
349
-
30.1
.1
缺少引号
350
-
30.1
.2
缺少词法单元
351
-
30.1
.3
出乎意料的扩展
351
-
30.2
逻辑错误
353
-
30.2
.1
防御式编程
353
-
30.2
.2
小心文件名
354
-
30.2
.3
核实输入
355
-
30.3
测试
355
-
30.4
调试
357
-
30.4
.1
查找问题区域
357
-
30.4
.2
跟踪
357
-
30.4
.3
在执行过程中检查值
359
-
30.5
总结
360
-
第31章
流程控制:case分支
361
-
31.1
case命令
361
-
31.1
.1
模式
363
-
31.1
.2
执行多次操作
365
-
31.2
总结
366
-
第32章
位置参数
367
-
32.1
访问命令行
367
-
32.1
.1
确定参数个数
369
-
32.1
.2
shift——访问多个参数
369
-
32.1
.3
简单应用
371
-
32.1
.4
在Shell函数中使用
-
位置参数
371
-
32.2
批量处理位置参数
372
-
32.3
一个更完整的应用
374
-
32.4
总结
377
-
第33章
流程控制:for循环
380
-
33.1
for的传统形式
380
-
33.2
for的C语言形式
383
-
33.3
总结
384
-
第34章
字符串与数字
387
-
34.1
参数扩展
387
-
34.1
.1
基本参数
388
-
34.1
.2
管理空变量扩展
388
-
34.1
.3
返回变量名的扩展
390
-
34.1
.4
字符串操作
390
-
34.1
.5
大小写转换
393
-
34.2
算术求值与扩展
395
-
34.2
.1
数字基数
395
-
34.2
.2
一元操作符
395
-
34.2
.3
简单算术
395
-
34.2
.4
赋值
397
-
34.2
.5
位操作
399
-
34.2
.6
逻辑操作
399
-
34.3
bc——任意精度计算器语言
401
-
34.3
.1
使用bc
402
-
34.3
.2
示例脚本
403
-
34.4
总结
404
-
第35章
数组
405
-
35.1
什么是数组
405
-
35.1
.1
创建数组
406
-
35.1
.2
为数组赋值
406
-
35.1
.3
访问数组元素
406
-
35.2
数组操作
408
-
35.2
.1
输出数组的全部内容
408
-
35.2
.2
确定数组元素的数量
409
-
35.2
.3
查找数组使用的索引
410
-
35.2
.4
向数组尾部添加元素
410
-
35.2
.5
数组排序
410
-
35.2
.6
删除数组
411
-
35.3
关联数组
412
-
35.4
总结
412
-
第36章
其他命令
413
-
36.1
分组命令与子Shell
413
-
36.2
陷阱
419
-
36.3
使用wait实现异步执行
421
-
36.4
具名管道
423
-
36.4
.1
创建具名管道
423
-
36.4
.2
使用具名管道
424
-
36.5
总结
424
转载:https://blog.csdn.net/epubit17/article/details/114291305