第四章 Shell的使用.docx
- 文档编号:1797588
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:39
- 大小:344.03KB
第四章 Shell的使用.docx
《第四章 Shell的使用.docx》由会员分享,可在线阅读,更多相关《第四章 Shell的使用.docx(39页珍藏版)》请在冰点文库上搜索。
第四章Shell的使用
第四章
Shell的使用
在前面的章节中已经学习了Linux操作系统的安装和基本使用,包括系统中常用的命令和文本编辑器等内容,这些都是在Linux系统中工作所必须掌握的基本技能。
从本章开始我们学习Linux系统管理员需要具备的管理技能,本章的重点是Shell环境的使用。
Shell环境是Linux用户与Linux系统之间的交互界面,在Shell环境中不仅可以输入执行单个的命令,还可以把需要执行的多个命令保存在文本文件中作为Shell脚本执行,使管理任务简单化。
通过本章的学习,可以了解Shell的发展历史,熟悉Bash环境的基本操作,理解并掌握输入输出重定向和管道的使用,编写简单的Shell脚本程序实行管理任务的自动执行。
4.1Shell环境
在Linux系统的使用过程中,可能并没有意识到Shell对于Linux系统的重要性,其实Shell程序从用户登录开始就伴随着我们使用Linux系统。
在本节中我们就来了解下Linux系统中的Shell环境。
4.1.1Shell的发生与发展
1、Shell的基本概念
Shell是操作系统中运行的程序,于系统中的其他程序不同,Shell程序位于操作系统内核和用户之间,负责接受用户输入的命令,在对已输入的命令进行解释后,将需要执行的命令程序传递给操作系统内核执行,因此Shell程序充当了一个“命令解释器”的角色,如右图所示。
在微软的系统中,DOS中的command.exe程序和Windows中的cmd.exe都属于Shell程序。
在UNIX操作系统中存在多种类型的Shell程序,下面就来简单了解一下这些Shell的功能。
2、Shell的发展和分类
UNIX操作系统从诞生之日起就工作在命令行方式下,因此UNIX操作系统中的Shell程序是与UNIX操作系统一起出现的,在UNIX操作系统的发展过程中,逐步出现了不同类型的Shell,其中最常用的包括Bsh、Csh、Ksh、Zsh和Bash等。
(1)Bsh
Bsh是BourneShell的简称,最初是由StephenR.Bourne于20世纪70年代中期在新泽西的AT&T贝尔实验室编写的,因此以Bourne的名字进行命名。
Bsh是产生较早的UNIXShell程序,实现了基本的Shell程序功能,除了承担命令解释器的功能外,Bsh还是编程语言,可以使用Bsh命令编写具有特定功能的Shell脚本程序。
(2)Csh
Csh是CShell的缩写,是BillJoy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发完成的,CShell使用C语言的语法风格,并因此得名。
Csh在用户的命令行交互界面上进行了很多改进,并增加了命令历史、别名、文件名替换、作业控制能功能。
因此Csh与Bsh相比,更加适合用户命令交互。
(3)Ksh
Ksh是KornShell的缩写,是由AT&T贝尔实验室的DavidKorn开发的,因此以Korn命令。
Ksh是在Bsh和Csh之后出现的,它结合了Bsh和Csh两者的功能优势,Ksh兼有Bsh的语法和Csh的交互特性,因此受到了用户的广泛欢迎。
(4)Bash
Bash是BourneAgainShell的缩写,从Bash的全名就可以看出,Bash是Bsh的升级替代品。
Bash是GNU项目的成员,也是著名的开源软件项目。
目前大多数Linux发行版本都是用Bash作为默认的Shell,当运行Shell程序时系统实际运行的是Bash程序。
(5)Zsh
Zsh兼具Ksh和Bash的优点,交互式操作效率更高,编程方便也有很好的操作性。
Bash作为大多数Linux系统的默认Shell,已经可以满足大部分系统关系需求了。
Zsh目前来说没有Bash使用的普遍。
3、RHEL5.4中Shell的使用
为了提高系统的兼容性,RHEL5.4系统对常用类型的Shell都提供了支持,下面学习在RHEL5.4中几种Shell的使用。
(1)RHEL5.4中提供的shell
在“/etc/”目录中的“shells”文件中记录了当前Linux系统中能够使用的Shell程序列表,列表中显示了Shell程序的全路径名。
Shell程序列表中的相当一部分Shell是其他Shell程序的符号链接文件,Linux系统中的这种做法是为了提高Shell程序之间的兼容性,例如tcsh是csh的兼容升级版本,因此在系统运行csh时将运行tcsh。
(2)Shell程序的转换
当Linux系统中的登录用户需要临时使用其他Shell程序时,可以直接输入相应的Shell命令运行Shell程序,新运行的Shell程序叫做原有Shell程序的子Shell。
例如,当前的Shell程序是Bash,输入ksh命令将运行Ksh,则Ksh是Bash的子Shell。
尽管Bash兼容了Ksh的很多特性,但在使用方法上还是有很大区别,例如Ksh中不支持help命令获取Shell命令的帮助信息。
几乎所有的shell程序都支持使用exit命令退出当前的Shell程序,退出当前shell程序后将返回上一级Shell程序(执行当前Shell程序前用户所在的Shell),如果没有上一级Shell升序,即当前Shell已经是用户的登录Shell,则用户退出系统登录。
除了可以使用exit命令退出Shell程序之外,大多数Shell都支持Ctrl+D组合键退出当前shell,Ctrl+D组合键是系统的功能键,不是命令,但是退出Shell的效果是相同的。
(3)用户默认Shell的设定与Shell修改
用户每次登录Linux系统时运行的Shell程序叫做用户的登录Shell。
用户的登录Shell信息是记录在“/etc/passwd”文件中的,在该文件保存的用户记录中,最后一个字段表示用户登录的Shell。
Linux系统中有相当多的系统用户账号的登录Shell设置为“/sbin/nologin”,nologin程序并不为用户提供正常的登录界面,因此这些用户账号将无法正常登录系统。
系统用户账号是一类特殊的用户账号,Linux系统需要这些账号的存在,但是又不希望这些账号能够进行正常的用户登录,因此将他们的登录Shell设置为“nologin”可以在一定程度上保证系统的安全性。
Linux系统中的普通用户可以使用chsh命令更改用户自己的登录Shell
例如用户lch的登录Shell是bash,使用chsh命令将自己的登录Shell更改为ksh。
用户可以通过查看环境变量SHELL的值来查看用户当前登录所使用的Shell程序。
chsh命令在执行后先提示用户输入登录口令,当验证用户输入口令正确后才提示用户输入新的Shell程序路径,这样可以提高系统的安全性。
chsh命令是通过更改“passwd”文件中用户记录的登录Shell字段俩实现用户登录Shell更改的,因此chsh命令成功执行后,新的Shell将在用户下一次登录系统时生效,即用户在退出当前的登录并再次登录系统时才会以新设置的Shell登录。
在上面的例子中,lch用户退出当前登录并重新登录系统后,当前的登录Shell已经变味ksh。
4.1.2Bash的主要功能
Bash是在Bsh和其他Shell的基础上发展而来的,Bash对Bsh兼容,并且充分吸收了其他Shell中的优秀特性,因此Bash在Linux操作系统中得到了广泛的应用,也是RHEL5.4中用户默认使用的Shell。
Bash主要具有以下优秀特点:
ØBash的命令行编辑功能为用户提供了方便的命令编辑环境
ØBash的命令和文件名补全功能为用户提供了快速输入命令和文件名的方式
ØBash的命令历史功能使用户可以重复执行已使用过的命令
ØBash的命令别名功能为用户提供了快速输入复杂命令的方法
ØBash支持对用户提交的作业进行控制,提供查看作业信息、调整作业的运行方式等功能
ØBash允许用户将常用的命令序列定义为功能键,实现一键操作的效果
ØBash提供了丰富的变量类命令与控制结构,增强了Shell脚本程序的灵活性
Bash功能的具体使用将在4.2节中讲解。
4.1.3Shell变量
在Shell的使用中,不可避免的要遇到“Shell变量”的概念,Shell变量用于在Shell程序中保存系统和用户需要使用的值,Shell变量可分为如下4种类型:
Ø环境变量
Ø预定义变量
Ø位置变量
Ø用户自定义变量(本地变量)
下面将学习以上4种Shell变量的使用。
1、环境变量
环境变量是用户登录时Linux系统为用户预先设定好的一类Shell变量。
环境变量的功能是设置用户在当前Shell中的工作环境,包括用户宿主目录、命令查找路径、用户当前目录等。
环境变量具有如下特点:
Ø环境变量的名称通常由大写字母、数字和其他字符组成,而不使用小写字母
Ø环境变量在Linux系统中拥有固定的含义,因此环境变量名称是固定的
Ø环境变量的初始值在用户登陆后就已经存在,并可以被其他命令读取和调用
Ø环境变量的值通常由Linux系统自动维护,无需用户人工设置
Ø环境变量中的值会随着用户状态的改变而改变,用户可以通过读取环境变量了解自己的当前状态
(1)查看环境变量
set命令用于查看系统中的所有本地定义的Shell变量
在set命令的显示结果中,每行显示一个变量的信息,变量名称和变量值的中间使用“=”进行分隔。
Linux系统中的环境变量较多,在使用set命令显示环境变量列表时,最好使用more命令进行分页显示。
当需要读取某个shell变量的值时,可以在变量名前加“$”符引用变量的值,例如可以使用“$PATH”来引用环境变量“PATH”的值。
echo命令用户显示字符串或Shell变量的值,使用“$变量名”作为echo命令的参数就可以显示指定环境变量的值。
当没有在环境变量前使用“$”时,变量名会被echo命令作为字符串进行显示,而不是显示变量的值。
env命令显示所有的环境变量
由于Linux系统中的环境变量很多,建议分页查看。
(2)常用的环境变量介绍
Linux中有如下的常用环境变量
ØUSER
ØUID
ØSHELL
ØHOME
ØPWD
ØPATH
ØPS1
ØPS2
ØHISTSIZE
ØLOGNAME
ØLANG
ØMAIL
$USER变量表示当前用户的登录名称,该变量的值与whoami命令和变量$LOGNAME的值一致。
$UID变量表示当前用户的用户号(UID),该变量的值与“id–u”命令结果一致。
$SHELL变量表示当前用户的登录Shell,该变量的值与“passwd”文件中的Shell字段一致。
$HOME变量表示当前用户的登录目录(宿主目录),该变量的值与“passwd”文件中的home字段一致。
$PWD变量表示用户当前所在的目录,该变量的值与pwd命令的结果一致。
$PATH变量表示当前用户的命令搜索路径,即用户不指定全路径名执行命令时,Shell程序将在哪些目录以及按照何种顺序进行命令的搜索。
如果我们编写的脚本放置在root宿主目录“/root”中,为了能够不使用绝对路径来执行,可以在PATH变量中添加命令搜索路径“/root”,这样直接运行脚本的名字即可。
$PS1和$PS2分别代表了当前用户的主提示符和辅助提示符。
主提示符是用户在命令行状态中看到的提示符字符串;辅助提示符是当前用户输入的命令内容在两行以上时(命令中有换行),在命令的第二行中出现的提示符,辅助提示符默认是“>”。
变量$PS1的值中,\u表示当前登录的用户,\h表示当前的主机名,\W表示当前的工作目录。
用户在输入较长的命令时,为了使命令的选项和参数的显示格式清晰,可以进入人为的命令换行,只要在命令的行尾输入“\”并回车后,Shell程序会认为命令没有完成输入,并显示辅助提示符提示用户继续输入命令。
掌握了常用的环境变量及其含义就可以较好地了解用户当前的状态信息,并且对理解Linux系统中的命令的实现大有益处。
(3)环境变量配置文件
Linux系统中用户的环境变量是在用户登录时设置完成的,环境变量的配置是通过配置文件实现的,环境变量配置文件可分为全局配置文件和用户配置文件两种。
环境变量全局配置文件包括“profile”和“bashrc”两个文件,Linux系统中所有的用户在登录时都会按照全局配置文件的内容设置工作环境。
“profile”和“bashrc”两个文件在功能上均有各自的分工。
“profile”文件负责设置全局的环境,并应用于所有的用户登录Shell。
“bashrc”文件用户定义全局的函数和别名,文件的内容除了为系统中所有登陆用户提供涉之外,也适用于非交互Shell和非登录Shell。
全局环境变量配置文件只有管理员root有权限进行修改和设置,文件中的配置内容是很严谨的,因此如果没有特殊要求,Linux系统管理员无需对全局环境变量进行修改。
对全局环境变量文件的错误修改有可能造成系统中所有用户登陆后都无法正常工作。
用户环境变量配置文件位于用户的宿主目录中,文件名是“.bash_profile”和“.bashrc”。
两个文件的名称都以“.”开始,在Linux系统中作为隐藏文件。
用户可以通过修改“.bash_profile”和“.bashrc”文件来更改自己的环境变量。
“.bash_profile”文件的作用类似于全局的“/etc/profile”文件,但是只对用户自身有效。
“.bash_profile”文件会在用户进行Shell登录时运行,并且会调用执行“.bashrc”文件中的内容。
用户自己定义的变量可以添加到“.bash_profile”文件的末尾。
“.bashrc”文件的作用类似于全局的“/etc/bashrc”,用于定义函数的别名,作用范围是当前用户的Shell。
在“.bashrc”文件中对“/etc/bashrc”文件进行了调用执行,用户自定义的内容需要添加在文件末尾。
“/etc/skel”目录中保存了初始的用户配置文件模板,当用户对自己的配置文件进行了错误的设置后,可以直接将“/etc/skel”目录中的模板文件复制到用户目录,从而恢复正确的初始配置。
掌握了全局配置文件“profile”和“bashrc”,以及用户配置文件“.bash_profile”和“.bashrc”的作用后,Linux系统管理员就可以将需要的环境变量配置添加到适当的位置。
对配置文件的修改不会影响Linux系统中的登录用户,用户重新进行Shell登陆后才会按照新的配置文件内容进行配置。
2、位置变量
位置变量(位置参数)与Shell脚本程序执行时所使用的命令参数相对应,命令行中的参数按照从左到右的顺序赋值给位置变量。
位置变量名称的格式是“$n”,其中“n”是参数的位置序号,位置变量的“n”是从“1”开始的,例如$1、$2、$3分别代表了命令的第1、2、3个参数,位置变量最多使用到$9。
$0代表所执行命令的名称,即命令本身。
虽然$0与位置变量的格式相同,但是$0属于预定义变量而不是位置变量。
下面我们使用exam01脚本文件说明位置变量的功能,exam01脚本文件的内容如下:
exam01脚本程序的功能是现实$0至$9的值,$0代表执行脚本的名称,$1至$9是位置变量,表示脚本程序执行时的命令参数。
通过以上实例,我们可以大致了解位置变量的作用。
通常,在编写Shell脚本时会使用位置变量接收用户指定的命令参数。
3、预定义变量
预定义变量是Linux系统中已定义好的变量,用户只能使用预定义变量,而不能创建或赋值预定义变量。
所有的预定义变量都是由“$”符合另一个符号组成的,常用的Shell预定义变量有:
Ø$#表示位置参数的数量
Ø$*表示所有位置参数的内容
Ø$?
表示命令执行后返回的状态,用户检查上一个命令的执行是否正确;在Linux系统中,命令退出状态为0表示命令正确执行,任何非0值表示命令执行错误
Ø$$表示当前进程的进程号
Ø$!
表示后台运行的最后一个进程号
Ø#0表示当前执行的进程名
预定义变量通常使用在Shell脚本中,在Shell交互命令中使用并不常见,但是仍然可以使用“echo”命令查看预定义变量的值。
4、用户自定义变量
用户自定义变量是Shell用户自己定义的变量,只有用户自己的Shell中有效,因此又成为本地变量。
与环境变量、位置变量和预定义变量3类变量相比较,自定义变量能够实现更加灵活的功能,因此自定义变量也是用户常用的一类变量。
(1)自定义变量的设置
Shell用户可以在命令行界面或Shell脚本中进行变量的自定义,用户变量不需要提前创建,在对变量第一次赋值时将被自动创建,用户自定义变量赋值的格式如下:
格式:
变量名=变量值
在变量赋值的命令语句中,“=”(等号)左边是被赋值的变量名,右边是为变量所赋的值,等号左右没有空格。
(2)自定义变量的查看与引用
自定义变量的引用方式与其他类型的变量相同,在变量名前加入“$”符。
变量被创建(赋值)后,使用echo命令可以查看变量的值。
set命令可以显示出系统中的所有变量,也包括用户自定义的变量。
变量被用户定以后会出现在set命令显示的变量列表中。
(3)自定义变量的输出
用户在当前Shell中定义了某个变量后,只能在当前的Shell中使用,而在当前Shell的子Shell中是无效的(无法引用定义的变量)。
为了在用户的子Shell或脚本程序中使用自定义变量,需要将用户自定义的变量“输出”为全局变量。
export命令用于输出变量为全局变量,命令的基本格式为:
格式:
export[-nf][name[=value]………]
export命令使用变量名作为参数,输出指定名称的变量为全局变量。
被export输出后的变量可以在用户所有的子Shell中使用。
export命令可以在输出变量的同时对指定名称的变量进行赋值(创建),这样在export命令之前就不需要单独为变量进行赋值了。
同一条export命令中可以指定多个变量名作为命令的参数。
(4)自定义变量的清除
当用户不再使用自定义变量时,可以使用“unset”命令对已定义的用户变量进行清除,unset命令的基本格式:
格式:
unset[-f][-v][name……]
unset命令使用变量名作为命令的参数,清除指定名称的变量名。
(5)使用readonly命令设置只读变量
如果使用readonly命令,变量就不能被修改或清除了。
可以看到设置readonly后,变量abc不能被清除。
对于环境变量的修改立即生效,却不会被保留下来。
为了永久的修改一些环境变量,可以修改一些相关的环境定义文件来实现,例如HISTSIZE、HOSTNAME等变量在“/etc/profile”文件中定义。
直接修改配置文件所作的环境变量设置,需要用户重新登录后才会生效。
4.1.4Shell中的特殊字符
Shell中除了普通字符外,还可以使用一些具有特殊含义和功能的字符。
在使用它们时应注意其特殊的含义和作用范围。
这些字符可以帮助用户实现模式的匹配、I/O重定向、组织命令等操作,接下来分别对这些特殊字符加以介绍。
1、通配符
与DOS系统类似,通配符常用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。
用户可以在作为命令参数的文件名中包含通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。
常用的通配符有“*”、“?
”和括在方括号“[]”中的字符序列。
“*”代表任意字符串,例如“s*”匹配以s开头的任意字符串。
注:
文件名前的原电“.”和路径名中的斜线“/”必须显示匹配,如“*”不能匹配”.file”,而“.*”才可以匹配”.file”。
“?
”代表任何单个字符。
例如执行“lsa?
”就可以列出当前目录中以a字母开头且只有两个字符的文件名。
“[]”代表一个字符范围,只要文件名中[]位置处的字符在[]通配符中指定的范围之内,那么这个文件名就与这个模式串匹配。
方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符“-”组成。
例如f[a-d]与f[abcd]的作用相同。
Shell程序将把与命令行中指定的模式串匹配的所有文件名都作为命令的参数,形成最终的命令,然后再执行这个命令。
注:
“[!
字符]”与前面“[]”的用法相反,它表示排除“[]”中的任意字符,如执行“ls[!
abc]*”命令就是列出不以字符abc中任意一个字符开头的所有文件。
举例:
“*”表示所有文件
“*log*”表示目录中所有文件名中包含log的文件
“[ab-dm]*”表示目录中所有文件名以a、b、c、d、m开头的文件
“[ab-dm]?
”表示目录中所有文件名以a、b、c、d、m开头且后面只跟有一个字符的文件
“/root/?
?
?
”表示root目录下所有名称为三个字符的文件
注:
连字符“-”仅在方括号内有效,表示字符范围,如在方括号外面就变成普通字符了。
而“*”和“?
”只有在方括号外面作为通配符,若出现在方括号之内,它们也失去通配符的意义,成为普通字符了。
如模式“-a[*?
]abc”中只有一对方括号是通配符,“*”和“?
”均为普通字符,因此,它匹配的模式的字符串只能是“-a*abc”和“-a?
abc”。
由于“*”、“?
”和“[]”对于Shell来说具有比较特殊的含义,因此在正常的文件名中不应出现这些字符。
特别是在文件名中不要出现它们,否则Shell匹配起来可能会无穷递归下去。
如果目录中没有与指定的模式串相匹配的文件名,那么Shell将使用此模式串本身作为参数传给有关命令。
2、引号
在Shell中引号分为三种:
单引号、双引号和反引号。
由单引号括起来的字符都作为普通字符出现。
特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。
由双引号括起来的字符,除“$”、“\”、“’”和“””这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待,对于“$”来说,就是用其后指定的变量的值来代替这个变量和$;对于“\”来说,是转义字符,它告诉Shell不要对其后面的那个字符进行特殊处理,而当做普通字符即可。
在双引号中,需要在前面加上转义字符(\)的只有4个字符:
“$”、“\”、“’”和“””。
反引号这个字符所对应的键一般位于键盘左上角,Tab上面的那个键。
反引号括起来的字符串被Shell解释为命令行,在执行时,Shell首先执行该命令行,并以它的标准输出结果取代整个反引号部分。
在第一次定义变量test时,使用了双引号“$HOME”,这时$HOME保持原有的特殊含义。
所以输出变量$test时实际输出的是$HOME的值;第二次定义变量test时,使用了单引号’$HOME’,这时$HOME不再拥有特殊含义,所有输出变量$test时输出的就是$HOME这个字符串本身。
最后一个命令使用echo返回一个字符串,但是字符串包含一个反引号,反引号中的命令会先执行,并把执行后的结果再放到字符串中。
3、其他符号
在其它符号中,最常见的是注释符“#”,“#”表示注释,其后的内容不会被当做命令或程序执行。
在Shell脚本中经常要对某些正文行进行注释,以增加程序的可读性。
在Shell脚本中以字符“#”开头的正文行表示注释行。
常见的符号有:
“&”:
表示该符号前的命令放到后台执行
“;”可以用来分隔多个命令,让多
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四章 Shell的使用 第四 Shell 使用