35.11基本参数······· 445 35.1.2管理空变量的展开 446 35.2返回变量名的参数展开 448 35.2.1字符串展开 448 35.2.2大小写转换 451 35.3算术求值和展开.. 453 35.3.1数基.... 454 35.3.2一元运算符 454 35.3.3简单算术 455 35.3.4赋值运算符 456 35.3.5位运算符 458 35.3.6逻辑运算符 459 35.4bc-一种高精度计算器语言 462 35.4.1使用bc 462 35.4.2一个脚本实例 463 35.5总结.... 464 35.6额外加分 465 35.7拓展阅读 465 36数组 466 36.1什么是数组? 466 36.2创建一个数组 466 36.3数组赋值 467 36.4访问数组元素 468 36.5数组操作 470 36.5.1输出整个数组的内容 470 36.5.2确定数组元素个数 471 36.5.3找到数组使用的下标 471 36.5.4在数组末尾添加元素 472 36.5.5数组排序 472 36.5.6删除数组 473 36.6关联数组....... 474 36.7总结.......... 474 15
35.1.1 基本参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 35.1.2 管理空变量的展开 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 35.2 返回变量名的参数展开 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 35.2.1 字符串展开 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 35.2.2 大小写转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 35.3 算术求值和展开 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 35.3.1 数基 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 35.3.2 一元运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 35.3.3 简单算术 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 35.3.4 赋值运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 35.3.5 位运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458 35.3.6 逻辑运算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 35.4 bc - 一种高精度计算器语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 35.4.1 使用 bc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 35.4.2 一个脚本实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463 35.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 35.6 额外加分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 35.7 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 36 数组 466 36.1 什么是数组? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 36.2 创建一个数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 36.3 数组赋值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 36.4 访问数组元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 36.5 数组操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 36.5.1 输出整个数组的内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 36.5.2 确定数组元素个数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 36.5.3 找到数组使用的下标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 36.5.4 在数组末尾添加元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 36.5.5 数组排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 36.5.6 删除数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 36.6 关联数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 36.7 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 15
36.8拓展阅读 ....475 37奇珍异宝 476 37.1组命令和子shell 476 37.1.1进程替换 480 37.2陷阱....... 483 37.3异步执行 486 37.3.1等待.....·. 486 37.4命名管道 487 37.4.1设置一个命名管道 488 37.4.2使用命名管道.. 488 37.5总结 489 37.6拓展阅读 489 16
36.8 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475 37 奇珍异宝 476 37.1 组命令和子 shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 37.1.1 进程替换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 37.2 陷阱 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 37.3 异步执行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 37.3.1 等待 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 37.4 命名管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 37.4.1 设置一个命名管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 37.4.2 使用命名管道 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 37.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 37.6 拓展阅读 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 16
1引言 我想给大家讲个故事。 故事内容不是Linus Torvalds在l991年怎样写了Linux内核的第一个版本,因为这些内容 你可以在许多Linux书籍中读到。我也不是来告诉你,更早之前,Richard Stallman是如何开 始GNU项目,设计了一个免费的类Uiⅸ的操作系统。那也是一个很有意义的故事,但大多 数Linux书籍也讲到了它。 我想告诉大家一个你如何才能夺回计算机管理权的故事。 在20世纪70年代末,我刚开始和计算机打交道时,正进行着一场革命,那时的我还是一 名大学生。微处理器的发明,使普通老百姓(就如你和我)真正拥有一台计算机成为可能。今 天,人们难以想象,只有大企业和强大的政府才能够拥有计算机的世界,是怎样的一个世界。 简单说,你做不了多少事情。 今天,世界已经截然不同了。计算机遍布各个领域,从小手表到大型数据中心,及大小介 于它们之间的每件东西。除了随处可见的计算机之外,我们还有一个无处不在的连接所有计算 机的网络。这已经开创了一个奇妙的,个人授权和创作自由的新时代,但是在过去的二三十年 里,一些事情一直在发生着。一个大公司不断地把它的管理权强加到世界上绝大多数的计算机 上,并且决定你对计算机的操作权力。幸运地是,来自世界各地的人们,正积极努力地做些事 情来改变这种境况。通过编写自己的软件,他们一直在为维护电脑的管理权而战斗着。他们建 设着Linux。 一提到Liux,许多人都会说到“自由”,但我不认为他们都知道“自由”的真正涵义。“自 由”是一种权力,它决定你的计算机能做什么,同时能够拥有这种“自由”的唯一方式就是知 道计算机正在做什么。“自由”是指一台没有任何秘密的计算机,你可以从它那里了解一切, 只要你用心的去寻找。 1.1为什么使用命令行 你是否注意到,在电影中一个“超级黑客”坐在电脑前,从不摸一下鼠标,就能够在30秒 内侵入到超安全的军事计算机中。这是因为电影制片人意识到,作为人类,本能地知道让计算 17
1 | 引言 我想给大家讲个故事。 故事内容不是 Linus Torvalds 在 1991 年怎样写了 Linux 内核的第一个版本,因为这些内容 你可以在许多 Linux 书籍中读到。我也不是来告诉你,更早之前,Richard Stallman 是如何开 始 GNU 项目,设计了一个免费的类 Unix 的操作系统。那也是一个很有意义的故事,但大多 数 Linux 书籍也讲到了它。 我想告诉大家一个你如何才能夺回计算机管理权的故事。 在 20 世纪 70 年代末,我刚开始和计算机打交道时,正进行着一场革命,那时的我还是一 名大学生。微处理器的发明,使普通老百姓(就如你和我)真正拥有一台计算机成为可能。今 天,人们难以想象,只有大企业和强大的政府才能够拥有计算机的世界,是怎样的一个世界。 简单说,你做不了多少事情。 今天,世界已经截然不同了。计算机遍布各个领域,从小手表到大型数据中心,及大小介 于它们之间的每件东西。除了随处可见的计算机之外,我们还有一个无处不在的连接所有计算 机的网络。这已经开创了一个奇妙的,个人授权和创作自由的新时代,但是在过去的二三十年 里,一些事情一直在发生着。一个大公司不断地把它的管理权强加到世界上绝大多数的计算机 上,并且决定你对计算机的操作权力。幸运地是,来自世界各地的人们,正积极努力地做些事 情来改变这种境况。通过编写自己的软件,他们一直在为维护电脑的管理权而战斗着。他们建 设着 Linux。 一提到 Linux,许多人都会说到“自由”,但我不认为他们都知道“自由”的真正涵义。“自 由”是一种权力,它决定你的计算机能做什么,同时能够拥有这种“自由”的唯一方式就是知 道计算机正在做什么。“自由”是指一台没有任何秘密的计算机,你可以从它那里了解一切, 只要你用心的去寻找。 1.1 为什么使用命令行 你是否注意到,在电影中一个“超级黑客”坐在电脑前,从不摸一下鼠标,就能够在 30 秒 内侵入到超安全的军事计算机中。这是因为电影制片人意识到,作为人类,本能地知道让计算 17
机圆满完成工作的唯一途径,是用键盘来操纵计算机。 现在,大多数的计算机用户只是熟悉图形用户界面(GUI),并且产品供应商和此领域的学 者会灌输给用户这样的思想,命令行界面(CLI)是过去使用的一种很恐怖的东西。这就很不 幸,因为一个好的命令行界面,是用来和计算机进行交流沟通的非常有效的方式,正像人类社 会使用文字互通信息一样。人们说,“图形用户界面让简单的任务更容易完成,而命令行界面 使完成复杂的任务成为可能”,到现在这句话仍然很正确。 因为Linux是以Unix家族的操作系统为模型写成的,所以它分享了Uniⅸ丰富的命令行工 具。Uix在20世纪80年代初显赫一时(虽然,开发它在更早之前),结果,在普遍地使用图 形界面之前,开发了一种广泛的命令行界面。事实上,很多人选择Liux(而不是其他的系统, 比如说Windows NT)是因为其可以使“完成复杂的任务成为可能”的强大的命令行界面。 1. 2这本书讲什么 这本书介绍如何生存在Liux命令行的世界。不像一些书籍仅仅涉及一个程序,比如像 shell程序,bash·这本书将试着向你传授如何与命令行界面友好相处。它是怎样工作的?它能 做什么?使用它的最好方法是什么? 这不是一本关于Liux系统管理的书。然而任何一个关于命令行的深入讨论,都一定会牵 涉到系统管理方面的内容,这本书仅仅提到一点儿管理方面的知识。但是这本书为读者准备好 了学习更多内容的坚实基础,毕竟要胜任系统管理工作也需要良好的命令行使用基本功。 这本书是围绕Liux而写的。许多书籍,为了扩大自身的影响力,会包含一些其它平台的 知识,比如Unix,MacOS X等。这样做,很多内容只能比较空泛的去讲了。另一方面,这本 书只研究了当代Linux发行版。虽然,对于使用其它类Unix系统的用户来说,书中95%的内 容是有用的,但这本书主要面向的对象是现代Liux命令行用户。 1.3 谁应该读这本书 这本书是为已经从其它平台移民到Liux系统的新手而写的。最有可能,你是使用某个 Windows版本的高手。或许是老板让你去管理一个Linux服务器,或许你只是一个桌面用户, 厌倦了系统出现的各种安全防御问题,而想要体验一下Liux。很好,这里欢迎你们! 不过一般来说,对于Linux的启蒙教育,没有捷径可言。学习命令行富于挑战性,而且很 费气力。这并不是说Limx命令行很难学,而是它的知识量很大,不容易掌握。Linux操作系 统,差不多有数以千计的命令可供用户操作。由此可见,要给自己提个醒,命令行可不是轻轻 松松就能学好的。 另一方面,学习Lix命令行会让你受益匪浅,给你极大的回报。如果你认为,现在你已 18
机圆满完成工作的唯一途径,是用键盘来操纵计算机。 现在,大多数的计算机用户只是熟悉图形用户界面(GUI),并且产品供应商和此领域的学 者会灌输给用户这样的思想,命令行界面(CLI)是过去使用的一种很恐怖的东西。这就很不 幸,因为一个好的命令行界面,是用来和计算机进行交流沟通的非常有效的方式,正像人类社 会使用文字互通信息一样。人们说,“图形用户界面让简单的任务更容易完成,而命令行界面 使完成复杂的任务成为可能”,到现在这句话仍然很正确。 因为 Linux 是以 Unix 家族的操作系统为模型写成的,所以它分享了 Unix 丰富的命令行工 具。Unix 在 20 世纪 80 年代初显赫一时 (虽然,开发它在更早之前),结果,在普遍地使用图 形界面之前,开发了一种广泛的命令行界面。事实上,很多人选择 Linux(而不是其他的系统, 比如说 Windows NT)是因为其可以使“完成复杂的任务成为可能”的强大的命令行界面。 1.2 这本书讲什么 这本书介绍如何生存在 Linux 命令行的世界。不像一些书籍仅仅涉及一个程序,比如像 shell 程序,bash。这本书将试着向你传授如何与命令行界面友好相处。它是怎样工作的?它能 做什么?使用它的最好方法是什么? 这不是一本关于 Linux 系统管理的书。然而任何一个关于命令行的深入讨论,都一定会牵 涉到系统管理方面的内容,这本书仅仅提到一点儿管理方面的知识。但是这本书为读者准备好 了学习更多内容的坚实基础,毕竟要胜任系统管理工作也需要良好的命令行使用基本功。 这本书是围绕 Linux 而写的。许多书籍,为了扩大自身的影响力,会包含一些其它平台的 知识,比如 Unix, MacOS X 等。这样做,很多内容只能比较空泛的去讲了。另一方面,这本 书只研究了当代 Linux 发行版。虽然,对于使用其它类 Unix 系统的用户来说,书中 95%的内 容是有用的,但这本书主要面向的对象是现代 Linux 命令行用户。 1.3 谁应该读这本书 这本书是为已经从其它平台移民到 Linux 系统的新手而写的。最有可能,你是使用某个 Windows 版本的高手。或许是老板让你去管理一个 Linux 服务器,或许你只是一个桌面用户, 厌倦了系统出现的各种安全防御问题,而想要体验一下 Linux。很好,这里欢迎你们! 不过一般来说,对于 Linux 的启蒙教育,没有捷径可言。学习命令行富于挑战性,而且很 费气力。这并不是说 Linux 命令行很难学,而是它的知识量很大,不容易掌握。Linux 操作系 统,差不多有数以千计的命令可供用户操作。由此可见,要给自己提个醒,命令行可不是轻轻 松松就能学好的。 另一方面,学习 Linux 命令行会让你受益匪浅,给你极大的回报。如果你认为,现在你已 18
经是高手了。别急,其实你还不知道什么才是真正的高手。不像其他一些计算机技能,一段时 间之后可能就被淘汰了,命令行知识却不会落伍,你今天所学到的,在十年以后,都会有用 处。命令行通过了时间的检验。 如果你没有编程经验,也不要担心,我会带你入门。 1.4这本书的内容 这些材料是经过精心安排的,很像一位老师坐在你身旁,耐心地指导你。许多作者用系统 化的方式讲解这些材料,虽然从一个作者的角度考虑很有道理,但对于Lix新手来说,他们 可能会感到非常困惑。 另一个目的,是想让读者熟悉Unix的思维方式,这种思维方式与Windows不同。在学习 过程中,我们会帮助你理解为什么某些命令会按照它们的方式工作,以及它们是怎样实现那样 的工作方式的。Linx不仅是一款软件,也是Unix文化的一小部分,它有自己的语言和历史 渊源。同时,我也许会说些过激的话。 这本书共分为五部分,每一部分讲述了不同方面的命令行知识。除了第一部分,也就是你 正在阅读的这一部分,这本书还包括: ·第二部分一学习shell开始探究命令行基本语言,包括命令组成结构,文件系统浏览,编 写命令行,查找命令帮助文档。 ·第三部分一配置文件及环境讲述了如何编写配置文件,通过配置文件,用命令行来操控 计算机。 ·第四部分一常见任务及主要工具探究了许多命令行经常执行的普通任务。类似于Uiⅸ的 操作系统,例如Lix,包括许多经典的命令行程序,这些程序可以用来对数据进行强大 的操作。 ·第五部分一编写Shell脚本介绍了shell编程,一个无可否认的基本技能,能够自动化许 多常见的计算任务,很容易学。通过学习shel编程,你会逐渐熟悉一些关于编程语言方 面的概念,这些概念也适用于其他的编程语言。 1.5怎样阅读这本书 从头到尾的阅读。它并不是一本技术参考手册,实际上它更像一本故事书,有开头,过程, 结尾。 19
经是高手了。别急,其实你还不知道什么才是真正的高手。不像其他一些计算机技能,一段时 间之后可能就被淘汰了,命令行知识却不会落伍,你今天所学到的,在十年以后,都会有用 处。命令行通过了时间的检验。 如果你没有编程经验,也不要担心,我会带你入门。 1.4 这本书的内容 这些材料是经过精心安排的,很像一位老师坐在你身旁,耐心地指导你。许多作者用系统 化的方式讲解这些材料,虽然从一个作者的角度考虑很有道理,但对于 Linux 新手来说,他们 可能会感到非常困惑。 另一个目的,是想让读者熟悉 Unix 的思维方式,这种思维方式与 Windows 不同。在学习 过程中,我们会帮助你理解为什么某些命令会按照它们的方式工作,以及它们是怎样实现那样 的工作方式的。Linux 不仅是一款软件,也是 Unix 文化的一小部分,它有自己的语言和历史 渊源。同时,我也许会说些过激的话。 这本书共分为五部分,每一部分讲述了不同方面的命令行知识。除了第一部分,也就是你 正在阅读的这一部分,这本书还包括: • 第二部分—学习 shell 开始探究命令行基本语言,包括命令组成结构,文件系统浏览,编 写命令行,查找命令帮助文档。 • 第三部分—配置文件及环境讲述了如何编写配置文件,通过配置文件,用命令行来操控 计算机。 • 第四部分—常见任务及主要工具探究了许多命令行经常执行的普通任务。类似于 Unix 的 操作系统,例如 Linux, 包括许多经典的命令行程序,这些程序可以用来对数据进行强大 的操作。 • 第五部分—编写 Shell 脚本介绍了 shell 编程,一个无可否认的基本技能,能够自动化许 多常见的计算任务,很容易学。通过学习 shell 编程,你会逐渐熟悉一些关于编程语言方 面的概念,这些概念也适用于其他的编程语言。 1.5 怎样阅读这本书 从头到尾的阅读。它并不是一本技术参考手册,实际上它更像一本故事书,有开头,过程, 结尾。 19