第11章 Shell编程概述
11.1 Shell简介
11.1.1 Shell是什么
前面的10个章节全面介绍了Linux系统的基础知识和常见命令。从本章开始,将把重点转到Shell编程上。实际上,读者很可能已经不止一次地接触到了Shell,只是没有注意而已:当你使用ssh客户端工具远程连接到系统,或坐在一台服务器前输入密码登录到系统中时,面前呈现的跳动的光标就是一个Shell。在计算机语言中,Shell是指一种命令行解释器,是为用户和操作系统之间通信提供的一种接口(想象一下,如果没有一种与计算机沟通的方式,那么计算机如何得到来自人脑的指令呢),它接受来自用户输入的命令,并将其转换为一系列的系统调用送到内核执行,并将结果输出给用户。图11-1显示了Shell在操作系统中的位置。
图11-1 Shell在系统中的位置
Shell分为两大类,一类是图形界面Shell(Graphical User Interface),用户可以在GNOME桌面空白处单击鼠标右键,在弹出的菜单中单击Open Terminal选项,打开Shell,如图11-2和图11-3所示。另一类是命令行式Shell(Command Line Interface),即CLI,如图11-4所示。
图11-2 在图形桌面打开终端
图11-3 图形模式下的终端
图11-4 命令行模式下的终端
事实上,Shell不只是一种解释器(在用户和系统间起着桥梁的作用),还是一种编程工具,称为脚本语言。与编译型语言(比如C/C++/Java等)不同,脚本语言又被称作解释型语言,这种语言经过编写后不需要做任何编译就可以运行。
什么是解释型语言呢?这就要说到计算机运行程序的两种方式了。计算机不能理解高级语言,只能理解机器语言,所以必须把高级语言翻译为机器码。而这种翻译的方式有两类,一类是编译,一类是解释,不同之处在于翻译的时间不同。编译型语言是运行前翻译,一般是使用编译工具将程序源码处理成机器认识的可执行文件(比如说Windows下的exe文件,Linux下的二进制可执行性文件),这种文件一旦产生,以后运行时将不需要再次翻译,所以一般来说,编译型语言的效率较高;而解释型语言是运行时翻译,执行一条语句就立即翻译一条,而且每次执行程序都需要进行解释,相对来说效率较低。但是也不能简单地认为编译型语言就一定比解释型效率高,随着解释器的发展,部分解释器能在运行程序时动态优化代码,因此这种效率差距也在一定程度上不断减小。
目前RedHat和CentOS发行版中默认安装了多种Shell,可以使用如下命令来确认系统中可用的Shell是什么版本:
- [root@localhost ~] # cat etcShells
- binsh #Bourne Shell
- binbash #Bourne again Shell
- sbinnologin #
- 非登录Shell
- bintcsh #tC Shell
- bincsh #C Shell
- binksh #Korn Shell
用户可以根据自己的偏好和擅长选择使用Shell。目前众多的Linux系统默认采用Bash Shell,所以本书只涉及Bash Shell的讲解,后面如果不做特别说明,书中所提的Shell都是指Bash Shell。