《LINUX与UNIX SHELL编程指南014.pdf》由会员分享,可在线阅读,更多相关《LINUX与UNIX SHELL编程指南014.pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载第14章 环境和shell变量为使s h e l l编程更有效,系统提供了一些 s h e l l变量。s h e l l变量可以保存诸如路径名、文件名或者一个数字这样的变量名。s h e l l将其中任何设置都看做文本字符串。有两种变量,本地和环境。严格地说可以有 4种,但其余两种是只读的,可以认为是特殊变量,它用于向s h e l l脚本传递参数。本章内容有:shell变量。环境变量。变量替换。导出变量。特定变量。向脚本传递信息。在系统命令行下使用位置参数。14.1 什么是shell变量变量可以定制用户本身的工作环境。使用变量可以保存有用信息,使系统获知用户相关设置。变量也用于保存暂时
2、信息。例如:一变量为 E D I TO R,系统中有许多编辑工具,但哪一个适用于系统呢?将此编辑器名称赋给 E D I TO R,这样,在使用c r o n或其他需要编辑器的应用时,这就是你将一直使用的E D I TO R取值,并将之用作缺省编辑器。下面是一个例子,登录的审核系统需要编辑。在菜单中选择此选项时,应用查询 E D I TO R变量值,其值为v i。系统知道可使用此编辑器。另一个例子需要登录数据库系统,键入下列命令:$isql-Udavet-Pabcd-Smethsys这里-S为正在连接的服务器名称。有一变量 D S Q U E RY保存服务器名称值。设置服务器名称值到D S Q
3、U E RY变量,这样如果登录时不使用-S提供服务器名称,应用将查询 D S Q U E RY变量,并使用其取值作为服务器名称。需要做的全部工作就是键入下列命令:$isql-Udavet-Pabcd工作方式同上例。14.2 本地变量本地变量在用户现在的 s h e l l生命期的脚本中使用。例如,本地变量f i l e-n a m e取值为l o o p.d o c,这个值只在用户当前s h e l l生命期有意义。如果在s h e l l中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的 s h e l l或进程设置此变量有效。表1 4-1列出各种实际变量模式使用变量时,
4、如果用花括号将之括起来,可以防止 s h e l l误解变量值,尽管不必一定要这样做,但这确实可用。要设置一本地变量,格式为:$variable-name=value 或$v a r i a b l e-n a m e=v a l u e 注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。s h e l l变量可以用大小写字母。表14-1 变量设置时的不同模式Va r i a b l e-n a m e=v a l u e设置实际值到v a r i a b l e-n a m eVa r i a b l e-n a m e+v a l u e如果设置了v a r i a b l
5、e-n a m e,则重设其值Va r i a b l e-n a m e:?v a l u e如果未设置v a r i a b l e-n a m e,显示未定义用户错误信息Va r i a b l e-n a m e?v a l u e如果未设置v a r i a b l e-n a m e,显示系统错误信息Va r i a b l e-n a m e:=v a l u e如果未设置v a r i a b l e-n a m e,设置其值Va r i a b l e-n a m e:-v a l u e同上,但是取值并不设置到v a r i a b l e-n a m e,可以被替换14.
6、2.1 显示变量使用e c h o命令可以显示单个变量取值,并在变量名前加$,例如:可以结合使用变量,下面将错误信息和环境变量 L O G N A M E设置到变量e r r o r-m s g。上面例子中,s h e l l首先显示文本,然后查找变量$L O G N A M E,最后扩展变量以显示整个变量值。14.2.2 清除变量使用u n s e t命令清除变量。unset variable-name14.2.3 显示所有本地shell变量使用s e t命令显示所有本地定义的s h e l l变量。第14章 环境和shell变量133下载s e t输出可能很长。查看输出时可以看出 s h
7、e l l已经设置了一些用户变量以使工作环境更加容易使用。14.2.4 结合变量值将变量并排可以使变量结合在一起:14.2.5 测试变量是否已经设置有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。此命令格式为:$v a r i a b l e:-v a l u e 意即如果设置了变量值,则使用它,如果未设置,则取新值。例如:变量c o l o u r取值b l u e,e c h o打印变量c o l o u r时,首先查看其是否已赋值,如果查到,则使用该值。现在清除该值,再来看看结果。上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:$v a r i a b
8、 l e:=v a l u e 下面是一个更实用的例子。查询工资清单应用的运行时间及清单类型。在运行时间及类型输入时,敲回车键表明用户并没有设置两个变量值,将使用缺省值(0 3:0 0和We e k l y),并传入a t命令中以按时启动作业。134第三部分 登 录 环 境下载在输入域敲回车键,输出结果如下:也可以编写脚本测试变量是否取值,然后返回带有系统错误信息的结果。下面的例子测试变量f i l e是否取值。以上结果可读性不好,但是可以加入自己的脚本以增加可读性。测试变量是否取值,如果未设置,则返回一空串。方法如下:$v a r i a b l e:+v a l u e 使用下述方法初始化
9、变量为空字符串。v a r i a b l e=$D E T I N A T I O N=14.2.6 使用变量来保存系统命令参数可以用变量保存系统命令参数的替换信息。下面的例子使用变量保存文件拷贝的文件名信息。变量s o u r c e保存p a s s w d文件的路径,d e s t保存c p命令中文件目标。下面例子中,变量d e v i c e保存磁带设备路径,然后用于在m t命令中倒带。14.2.7 设置只读变量如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。格式如下:v a r i a b l e-n a m e=v a l
10、u ereadonly variable-name下面的例子中,设置变量为系统磁带设备之一的设备路径,将之设为只读,任何改变其第14章 环境和shell变量135下载值的操作将返回错误信息。要查看所有只读变量,使用命令r e a d o n l y即可。14.3 环境变量环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。s h e l l中执行的用户进程均称为子进程。不像本地变量(只用于现在的 s h e l l)环境变量可用于所有子进程,这包括编辑器、脚本和应用。环境变量可以在命令行中设置,但用户注销时这些值将丢失,因此最好在.p r o f i l e文件中定义。系统管理员可
11、能在/e t c/p r o f i l e文件中已经设置了一些环境变量。将之放入 p r o f i l e文件意味着每次登录时这些值都将被初始化。传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用 e x p o r t命令导出。环境变量与本地变量设置方式相同。14.3.1 设置环境变量V A R I A B L E-N A M E=v a l u e;export VARIABLE-NAME在两个命令之间是一个分号,也可以这样写:V A R I A B L E-N A M E=v a l u eExport VARIABLE-NAME14.3.2 显示环境变量显示环境变量与显
12、示本地变量一样,例子如下:使用e n v命令可以查看所有的环境变量。136第三部分 登 录 环 境下载14.3.3 清除环境变量使用u n s e t命令清除环境变量:14.3.4 嵌入shell变量Brourne shell 有一些预留的环境变量名,这些变量名不能用作其他用途。通常在/e t c/p r o f i l e中建立这些嵌入的环境变量,但也不完全是,这取决于用户自己。以下是嵌入 s h e l l变量列表。1.CDPAT H改变目录路径变量,保留一系列由冒号隔开的路径名,用于c d命令。如果设置了C D PAT H,c d一个目录时,首先查找 C D PAT H,如果C D PA
13、T H指明此目录,则此目录成为当前工作目录。例子如下:$CDPATH=:/home/dave/bin:/usr/local/apps;export CDPATH.如果要$cd appsc d命令首先在C D PAT H中查找目录列表,如果发现a p p s,则它成为当前工作目录。2.EXINITE X I N I T变量保存使用v i编辑器时的初始化选项。例如,调用 v i时,要显示行号,且在第1 0个空格加入t a b键,命令为:$EXINIT=set nu tab=10;export EXINIT3.HOMEH O M E目录,通常定位于 p a s s w d文件的倒数第 2列,用于保存
14、用户自身文件。设置了H O M E目录,可以简单使用c d命令进入它。也可以用$cd$HOME4.IFS第14章 环境和shell变量137下载I F S用作s h e l l指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空格、新行或t a b键。I F S在分隔文件或变量中各域时很有用。下面的例子将 I F S设置为冒号,然后echo PAT H变量,给出一个目录分隔开来的可读性很强的路径列表。要设置其返回初始设置:$IFS=;export IFS这里 为空格和t a b键。5.LOGNAME此变量保存登录名,应该为缺省设置,但如果没有设置,可使用下面命令完成它:6.MAI
15、LM A I L变量保存邮箱路径名,缺省为/var/spool/mail/。s h e l l周期性检查新邮件,如果有了新邮件,在命令行会出现一个提示信息。如果邮箱并不在以上指定位置,可以用M A I L设置。$MAIL=/usr/mail/dave;export MAIL7.MAILCHECKM A I L C H E C K缺省每6 0 s检查新邮件,但如果不想如此频繁检查新邮件,比如设为每 2 m,使用命令:$MAILCHECK=120;export MAILCHECK8.MAILPAT H如果有多个邮箱要用到M A I L PAT H,此变量设置将覆盖M A I L设置。$MAILPA
16、TH=/var/spool/dave:/var/spool/admin;export MAILPATH上面的例子中,M A I L检测邮箱d a v e和a d m i n。9.PAT HPAT H变量保存进行命令或脚本查找的目录顺序,正确排列这个次序很重要,可以在执行命令时节省时间。你一定不想在已知命令不存在的目录下去查找它。通常情况,最好首先放在H O M E目录下,接下来是从最常用到一般使用到不常用的目录列表次序。如果要在当前工作目录下查询,无论在哪儿,均可以使用句点操作。目录间用冒号分隔,例如:$PATH=$HOME/bin:.:/bin:/usr/bin;export PATH使用上
17、面的例子首先查找 H O M E/b i n目录,然后是当前工作目录,然后是/b i n,最后是/u s r/b i n。PAT H可以在系统目录下/e t c/p r o f i l e中设置,也可以使用下面方法加入自己的查找目录。$PATH=$PATH:/$HOME/bin:.;export PATH这里使用了/e t c/p r o f i l e中定义的PAT H,并加入$H O M E/b i n和当前工作目录。一般来说,在查找路径开始使用当前工作目录不是一个好办法,这样很容易被其他用户发现。10.PS1基本提示符包含 s h e l l提示符,缺省对超级用户为#,其他为$。可以使用
18、任何符号作提示138第三部分 登 录 环 境下载符,以下为两个例子:11.PS2P S 2为附属提示符,缺省为符号。P S 2用于执行多行命令或超过一行的一个命令。12.SHELLS H E L L变量保存缺省s h e l l,通常在/e t c/p a s s w d中已设置,但是如有必要使用另一个 s h e l l,可以用如下方法覆盖当前s h e l l:13.TERMINFO终端初始化变量保存终端配置文件的位置。通常在/u s r/l i b/t e r m i n f o或/u s r/s h a r e/t e r m i n f o$TERMINFO=/usr/lib/ter
19、minfo;export TERMINFO14.TERMT E R M变量保存终端类型。设置T E R M使应用获知终端对屏幕和键盘响应的控制序列类型,常用的有v t 1 0 0、v t 2 0 0、v t 2 2 0-8等。$TERM=vt100;export TERM15.TZ时区变量保存时区值,只有系统管理员才可以更改此设置。例如:返回值表明正在使用格林威治标准时间,与 G M T时差为0,并作E D T保存。14.3.5 其他环境变量还有一些预留的环境变量。其他系统或命令行应用将用到它们。以下是最常用的一些,注意这些值均未有缺省设置,必须显示说明。1.EDITO R设置编辑器,最常用。
20、$EDITOR=vi;export EDITOR2.PWD当前目录路径名,用c d命令设置此选项。3.PA G E R保存屏幕翻页命令,如p g、m o r e,在查看m a n文本时用到此功能。$PAGER=pg-f-p%d;export PAGER4.MANPAT H第14章 环境和shell变量139下载保存系统上m a n文本的目录。目录间用冒号分隔。$MANPATH=/usr/apps/man:/usr/local/man;export MANPATH5.LPDEST或P R I N T E R保存缺省打印机名,用于打印作业时指定打印机名。$LPDEST=hp3si-systems1
21、4.3.6 set命令在$H O M E.p r o f i l e文件中设置环境变量时,还有另一种方法导出这些变量。使用 s e t命令-a选项,即set-a指明所有变量直接被导出。不要在/e t c/p r o f i l e中使用这种方法,最好只在自己的$H O M E.p r o f i l e文件中使用。14.3.7 将变量导出到子进程s h e l l新用户碰到的问题之一是定义的变量如何导出到子进程。前面已经讨论过环境变量的工作方式,现在用脚本实现它,并在脚本中调用另一脚本(这实际上创建了一个子进程)。以下是两个脚本列表f a t h e r和c h i l d。f a t h e
22、 r脚本设置变量f i l m,取值为A Few Good Men,并将变量信息返回屏幕,然后调用脚本c h i l d,这段脚本显示第一个脚本里的变量 f i l m,然后改变其值为Die Hard,再将其显示在屏幕上,最后控制返回f a t h e r脚本,再次显示这个变量。140第三部分 登 录 环 境下载看看脚本显示结果。因为在f a t h e r中并未导出变量f i l m,因此c h i l d脚本不能将f i l m变量返回。如果在f a t h e r脚本中加入e x p o r t命令,以便c h i l d脚本知道f i l m变量的取值,这就会工作:因为在脚本中加入了
23、e x p o r t命令,因此可以在任意多的脚本中使用变量 f i l m,它们均继承了f i l m的所有权。不可以将变量从子进程导出到文进程,然面通过重定向就可做到这一点14.4 位置变量参数本章开始提到有4种变量,本地、环境,还有两种变量被认为是特殊变量,因为它们是只读的。这两种变量即为位置变量和特定变量参数。先来看一看位置变量。如果要向一个s h e l l脚本传递信息,可以使用位置参数完成此功能。参数相关数目传入脚本,此数目可以任意多,但只有前 9个可以被访问,使用 s h i f t命令可以改变这个限制。本书后面将讲到s h i f t命令。参数从第一个开始,在第 9个结束;每个
24、访问参数前要加$符号。第一个参数为0,表示预留保存实际脚本名字。无论脚本是否有参数,此值均可用。如果向脚本传送Did You See Th e Full Mo o n信息,下面的表格讲解了如何访问每一个参数。$0$1$2$3$4$5$6$7$8$9脚本名字Did Yo uS e eT h eF u l lM o o n第14章 环境和shell变量141下载14.4.1 在脚本中使用位置参数在下面脚本中使用上面的例子。这里只传递6个参数,7、8、9参数为空,正像预计的那样。注意,第一个参数表示脚本名,当从脚本中处置错误信息时,此参数有很大作用。下面的例子返回脚本名称。注意$0返回当前目录路径,
25、如果只返回脚本名,在 b a s e n a m e命令下参数设为$0,刚好得到脚本名字。14.4.2 向系统命令传递参数可以在脚本中向系统命令传递参数。下面的例子中,在 f i n d命令里,使用$1参数指定查找文件名。142第三部分 登 录 环 境下载另一个例子中,以$1向g r e p传递一个用户 i d号,g r e p使用此i d号在p a s s w d中查找用户全名。14.4.3 特定变量参数既然已经知道了如何访问和使用 s h e l l脚本中的参数,多知道一点相关信息也是很有用的,有必要知道脚本运行时的一些相关控制信息,这就是特定变量的由来。共有 7个特定变量,见表1 4-2
26、。表14-2 特定s h e l l变量$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个$脚本运行的当前进程I D号$!后台运行的最后一个进程的进程I D号$与$#相同,但是使用时加引号,并在引号中返回每个参数$-显示s h e l l使用的当前选项,与s e t命令功能相同$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。现在来修改脚本p a r a m并替换各种特定变量,与以前的例子不同,用不同的传递文本重新运行脚本。第14章 环境和shell变量143下载特定变量的输出使用户获知更多的脚本相关信息。可以检查传递了多
27、少参数,进程相应的I D号,以免我们想杀掉此进程。14.4.4 最后的退出状态注意,$?返回0。可以在任何命令或脚本中返回此变量以获得返回信息。基于此信息,可以在脚本中做更进一步的研究,返回 0意味着成功,1为出现错误。下面的例子拷贝文件到/t m p,并使用$?检查结果。现在尝试将一个文件拷入一个不存在的目录:使用$?检验返回状态,可知脚本有错误,但同时发现 c p:c a n n o t.,因此检验最后退出状态已没有必要。在脚本中可以用系统命令处理输出格式,要求命令输出不显示在屏幕上。为此可以将输出重定向到/d e v/n u l l,即系统b i n中。现在怎样才能知道脚本正确与否?好,这时可以用最后退出状态命令了。请看上一个例子的此形式的实际操作结果。通过将包含错误信息的输出重定向到系统 b i n中,不能获知最后命令返回状态,但是通过使用$!,(其返回值为1)可知脚本失败。检验脚本退出状态时,最好将返回值设置为一个有意义的名字,这样可以增加脚本的可读性。144第三部分 登 录 环 境下载14.5 小结变量可以使s h e l l编程更容易。它能够保存输入值并提高效率。s h e l l变量几乎可以包含任何值。特定变量增强了脚本的功能并提供了传递到脚本的参数的更多信息。第14章 环境和shell变量145下载
限制150内