第3章Shell与Vim编辑器
Shell是允许用户输入命令的界面,Linux中*常用的交互式Shell是bash。本章主要介绍Shell的功能和Vim编辑器的使用。
3.1Shell
Shell是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。
3.1.1Shell概述〖*2〗1. Shell的地位Shell在Linux系统中具有极其重要的地位,Linux系统结构组成如图31所示。
2. Shell的功能
Shell*重要的功能是命令解释,从这种意义上来说,Shell是一个命令解释器。Linux系统中的所有可执行文件都可以作为Shell命令来执行。将可执行文件进行一下分类,如表31所示。表31可执行文件的分类
类别说明Linux命令存放在/bin、/sbin目录下内置命令出于效率的考虑,将一些常用命令的解释程序构造在Shell内部实用程序存放在/usr/bin、/usr/sbin、/usr/local/bin等目录下Linux操作系统与实训(CentOS 7.4 & RHEL 7.4)第3章Shell与Vim编辑器续表
类别说明用户程序用户程序经过编译生成可执行文件后,也可作为Shell命令运行Shell脚本由Shell语言编写的批处理文件图31Linux系统结构组成
当用户提交了一个命令后,Shell首先判断它是否为内置命令,如果是内置命令,就通过Shell内部的解释器将其解释为系统功能调用并转交给内核执行;若是外部命令或实用程序,就试图在硬盘中查找该命令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。在查找该命令时分为两种情况。
(1) 用户给出了命令路径,Shell就沿着用户给出的路径查找,若找到则调入内存;若没找到则输出提示信息。
(2) 用户没有给出命令的路径,Shell就在环境变量PATH所指定的路径中依次进行查找,若找到则调入内存;若没找到则输出提示信息。
图32描述了Shell执行命令解释的过程。
图32Shell执行命令解释的过程
此外,Shell还具有以下一些功能。
Shell环境变量。
正则表达式。
输入/输出重定向与管道。
3. Shell的主要版本
表32列出了几种常见的Shell版本。表32Shell的不同版本
版本说明Bourne Again Shell(bash.bsh的扩展) bash是大多数Linux系统的默认Shell。bash与bsh完全向后兼容,并且在bsh的基础上增加和增强了很多特性。bash也包含了很多C Shell和Korn Shell中的优点。bash有很灵活和强大的编程接口,同时又有很友好的用户界面Korn Shell(ksh)Korn Shell(ksh)由Dave Korn所写。它是UNIX系统上的标准Shell。另外,在Linux环境下有一个专门为Linux系统编写的Korn Shell的扩展版本,即Public Domain.Korn Shell(pdksh)tcsh(csh的扩展)tcsh是C.Shell的扩展。tcsh与csh完全向后兼容,但它包含了更多的使用户感觉方便的新特性,其*大的提高是在命令行编辑和历史浏览方面3.1.2Shell环境变量
Shell支持具有字符串值的变量。Shell变量不需要专门的说明语句,通过赋值语句完成变量说明并予以赋值。在命令行或Shell脚本文件中使用$name的形式引用变量name的值。
1. 变量的定义和引用
在Shell中,变量的赋值格式如下: name=string
其中,name是变量名,它的值就是string;“=”是赋值符号。变量名是以字母或下画线开头的字母、数字和下画线字符序列。
通过在变量名(name)前加$字符(如$name)引用变量的值,引用的结果就是用字符串string代替$name。此过程也称为变量替换。
在定义变量时,若string中包含空格、制表符和换行符,则string必须用'string'(或者"string")的形式,即用单(双)引号将其括起来。双引号内允许变量替换,而单引号内则不可以。
下面给出一个定义和使用Shell变量的例子。 //显示字符常量
$ echo who are you
who are you
$ echo 'who are you'
who are you
$ echo "who are you"
who are you
$
//由于要输出的字符串中没有特殊字符,所以''和""的效果是一样的
$ echo Je t'aime
>
/由于要使用特殊字符('),但“'”不匹配,Shell认为命令行没有结束,按Enter键后会出现系统
第二提示符,让用户继续输入命令行,按Ctrl C组合键结束/
$
为了解决这个问题,可以使用下面的两种方法。 $ echo "Je t'aime"
Je t'aime
$ echo Je t\\'aime
Je t'aime
2. Shell变量的作用域
与程序设计语言中的变量一样,Shell变量有其规定的作用范围。Shell变量分为局部变量和全局变量。
(1) 局部变量的作用范围仅**制在其命令行所在的Shell或Shell脚本文件中。
(2) 全局变量的作用范围则包括本Shell进程及其所有子进程。
(3) 可以使用export内置命令将局部变量设置为全局变量。
下面给出一个Shell变量作用域的例子。 //在当前Shell中定义变量var1
$ var1=Linux
//在当前Shell中定义变量var2并将其输出
$ var2=unix
$ export var2
//引用变量的值
$ echo $var1
Linux
$ echo $var2
Unix
//显示当前Shell的PID
$ echo $$
2670
$
//调用子Shell
$ bash
//显示当前Shell的PID
$ echo $$
2709
//由于var1没有使用export命令,所以在子Shell中已无值
$ echo $var1
//由于var2使用export命令,所以在子Shell中仍有值
$ echo $var2
unix
//返回主Shell,并显示变量的值
$ exit
$ echo $$
2670
$ echo $var1
Linux
$ echo $var2
unix
$
3. 环境变量
环境变量是指由Shell定义和赋初值的Shell变量。Shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。所有环境变量都是全局变量,并可以由用户重新设置。表33列出了Shell中常用的环境变量。表33Shell中的环境变量
环境变量名说明EDITOR、FCEDITbash fc命令的默认编辑器HISTFILE用于存储历史命令的文件HISTSIZE历史命令列表的大小HOME当前用户的用户目录OLDPWD前一个工作目录PATHbash寻找可执行文件的搜索路径PS1命令行的一级提示符PS2命令行的二级提示符PWD当前工作目录SECONDS当前Shell开始后所经过的秒数不同类型的Shell的环境变量有不同的设置方法。在bash中,设置环境变量用set命令,命令的格式是: set 环境变量=变量的值
例如,设置用户的主目录为/home/john,可以用以下命令。