2019年7月29日 星期一

shell变量

学习如何熟练的使用shell是非常重要的。可以确定的是,shell和其他复杂的Unix程序相似,拥有许多不真的需要理解的特性。但是,shell中有许多基本的思想拥有极大的实用价值。下面是具体的列表:
交互式shell
进程
shell变量
shell选项
元字符
引用
外部命令
内置命令
搜索路径
命令替换
历史列表
自动补全
命令行编辑
别名
初始化文件
注释
看上去很多,但是我们必须理解和学习这些东西。这需要很长一段时间,我们需要慢慢学习。
众所周知,shell共有两个大家族:Bourne家族(Bash,Korn shell)和C-shell, Tcsh)。当学习如何使用shell时,根据所使用的shell不同,一些具体细节可能有所不同。
首先,您需要知道自己正在使用什么shell。如果您还不确定,可以登录系统使用下述命令显示所使用shell的名称:

echo $SHELL
1.交互式shell和非交互式shell 

交互式程序指的是与人进行沟通的程序。当运行交互式程序时,程序的输入来源于键盘或者鼠标,而程序的输出发送到显示器。例如,当使用字处理程序或者web浏览器时,所使用的就是交互式程序。
非交互式程序指的是独立于人运行的程序。一般情况下,它从文件获取输入画,并将输入写入到另一个文件中。例如,当编译程序(对程序进行处理,从而使程序可以运行)时,使用的就是一个非交互式程序,即编译器。
有时候,交互式和非交互式程序之间的界限可能有点模糊。例如,交互式程序可能将结果发送给文件或者打印机。同理,非交互式程序也可能要求您使用键盘输入一些数据,或者在发生重要事情时在显示器上显示一个消息。
然而,实际上,程序仍然简单地分为交互式程序(与人一起工作)和非交互式程序(独自工作)。通常,交互式程序从人(通过键盘,鼠标)获取输入,并且将输出发送给人(通过显示器,扬声器)。非交互式程序使用非人类资源(例如文件),并且将输出发送给非人类资源(例如另一个文件)。因此,这里出现了一个问题,shell属于哪一种:交互式还是非交互式的?
答案是两种都是,shell既可以充当用户界面,也可以做脚本解释器。要使用CLI(命令行界面),需要打开一个终端窗口或者使用一个虚拟终端。当见到shell提示是,就可以输入命令。然后shell处理命令,处理命令完成后,shell显示另一个提示。当以这种方式工作时,shell就是用户界面,因此我们可以说您使用的shell是一个交互式shell
另外,您还可以创建一组命令(成为shell脚本),并保存在一个文件中。当运行脚本时,shell从文件中读取命令,并且在不需要输入的情况下一次处理所有的命令。当发生这种情况时,我们就称您使用的shell是一个非交互式shell
在这两种情况下,所使用的shell是同一类型的shell,理解这一点非常重要。之所以能这样,是因为shell被设计成为既可以交互式工作,又可以非交互式工作。
登录时,系统为您启动一个shell,并设置成交互式的。同样,当从命令行手动启动一个新shell时(例如通过键入bash或者tcsh),新shell也会被设置成交互式的。
另一方面,当运行shell脚本时,会自动启动一个新的shell,并将解释脚本的任务交给该shell处理。这个新shell被设置成为非交互式的。一旦任务完成,也就是说脚本执行完成,非交互式shell也就终止。
那么shell是如何知道它应该是交互式的还是非交互式的呢?这取决于shell启动时给它指定的选项。

2.环境,进程和变量 

在Unix系统中,每个对象都被表示为一个文件或者进程。简单的讲,文件存放数据或者用来访问资源,而进程是正在执行的程序。因此,一个正在运行的shell就是一个进程。同理,任何人从shell中启动的程序也都是一个进程。
在进程运行过程中,它需要访问所谓的环境,即一组用来存放信息的变量。什么是变量呢?
变量是一个用来存储数据的实体。每个变量都有一个名称和一个值。其中变量名是用来引用变量的标识符,值是存储在变量中的数据。
下面我们来举个例子。Unix用户使用一个叫TERM的变量来存储所使用终端的类型名称。这样,任何需要知道终端类型的程序,只需简单的查看TERM的值即可。最常见的TERMxterm, linux, vt100ansi
当命名变量时,您拥有很大的灵活性:只有两个简单的规则。首先,变量名必须由大写字母(A-Z),小写字母(a-z),数字(0-9)或者下划线字符(_)构成。其次,变量名的第一个字母或者下划线,不能是数字。因此,变量名TERM, pathTIME_ZONE都是有效的,而变量名2HARLEY是无效的。
当使用Unix shell时,有两种不同类型的变量。它们分别称为“shell变量”和“环境变量”。通常,变量是有4种不同类型的操作,即创建变量,查看变量的值,修改变量的值以及销毁变量。
通俗的讲,可以将变量看作一个小盒子。变量名位于盒子上,而变量的值位于盒子里面。您可以想象成这样,即一个名为TERM的盒子,里面包含一个单词xterm。这里我们说,变量TERM的值为xterm
对于大多数编程语言来说,变量可以含许多不同的数据,有字符,字符串,整型数,浮点型数,数组,集合等。至于shell,变量几乎总是存储一种类型的数据,即字符串,也就是一串纯文本字符。例如,在上面的例子中,变量TERM存储的字符串包含5个字符:x, t, e, rm
在创建变量时,尽管不是必须的,但还是通常会给它赋一个值。如果变量没有赋值,那么我们可以说,这个变量拥有了一个null值,这意味着这个变量没有值。这就好比创建了一个盒子,给这个盒子起了一个名字,但是没有在盒子里面放任何东西。如果变量拥有null值,那么在需要时,随之可以给这个变量赋一个值。
现在我们来看看变量,环境和进程是如何结合在一起的。考虑下述情形,您在shell提示处启动了vi文本编辑器。用技术术语来讲,我们可以说一个进程(shell)启动了另一个进程(vi)。
当发生这种情况时,第一个进程称为父进程或者双亲,第二个进程称为子进程或者孩子。在这个例子中,父进程就是shell,而子进程就是vi
在子进程创建时,系统为子进程复制了父进程的环境。我们说子进程继承了父进程的环境。这意味着父进程可以访问的全部环境变量,现在子进程也可以访问。
例如,在我们的例子中,当创建vi(子进程)时,它继承了shell(父进程)的环境。这种情况下,为了查明正在使用的终端类型,vi现在能够查看TERM变量的值。这就是的vi可以正确格式话它的输出,以适应特定的终端。


3.环境变量和shell变量
在程序中,局部变量只存在于创建它的范围内。例如,假设您在编写一个程序,创建了一个只在函数calculate中使用的变量count,我们就可以说变量count是一个局部变量。更具体的讲,可以说变量count是函数calculate的局部变量。这意味着,当函数calculate运行时,变量count才存在;一旦calculate停止运行,变量count就不存在了。
另一方面,全局变量可以在程序的任何地方使用。例如,假如您正在一个对一长串数字尽享统计运算的程序。如果将这个数据列表定义为全局变量,那么它就能在程序的所有地方使用。这意味着,如果一个函数或者过程对这个列表进行了修改,那么程序的其他部分也会看到该修改。
这里有一个问题:当使用Unix Shell时,shell中的全局变量和局部变量与程序员使用的全局变量和局部变量相似吗?
答案是肯定的。所有的shell都使用全局变量和局部变量,您需要知道它们的运转方式。首先,shell中有环境变量。因为环境变量对所有进程可用,所以它们是全局变量,实际上,我们通常称环境变量为全局变量。
其次,有的shell变量只在特定的shell中使用,并不属于环境。因此,这些变量不从父进程传递给子进程,基于这一原因,我们称这种变量为局部变量。
通常,局部(shell)变量以两种方式使用。第一种方式,它们可能用来存放对shell本身有意义的信息。例如,在C-shell和Tcsh中,shell变量ignoreeof用来确定shell在用户按下^D时是否忽略eof信号。
第二种方式,shell变量在shell脚本中以普通程序中局部变量的使用方式使用:作为临时存储容器。因此在编写shell脚本的过程中,当需要临时存储时就可以创建这样的shell变量。
到目前为止,所有这些结论都比较直接。shell变量是创建它们的shell局部变量。环境变量是全局变量,因为使用相同环境的任何进程都可以访问它们。
但是,在实际中还有一个问题。这是因为在shell中,局部变量和全局变量之间的界限是模糊的。基于这一原因,我们需要花一些时间准确解释shell如何处理变量。此外,Bourne和C-shell家族之间有明显的区别。我们需要分开讨论它们,这些概念非常重要,因此我们需要先了解两大shell家族中变量的工作方式,不管您现在使用的是哪一个shell。
在开始之前,先解释一下变量是如何命名的。在一些编程语言中,有一个传统,即全局变量通常采用大写字母的名称,而局部变量采用小写字母的名称。C-Shell家族(C-Shell, Tcsh)采用这种传统方式。环境变量采用大写字母的名称,如HARLEY;shell变量采用小写字母的名称,如harley
Bourne shell家族(Bash, Korn shell)有所不同;shell变量和环境变量传统上都采用大写字母的名称。原因是什么呢?在后面我们会解释。
对于大多数编程语言来说,变量或者是局部的,或者是全局的。而对于shell来说,有一个奇怪的问题的;一些变量同时拥有局部变量和全部变量的含义。换句话说,就是有一些变量对shell本身是有用的(这意味着这些变量应该是shell变量),并且对由shell启动的进程也是有用的(这意味着有些变量应该是环境变量)。
Bourne shell家族通过将变量或者只定义为局部变量,或者同时定义为局部和全部变量来解决这个问题。Bourne shell家族的shell中没有完全的全局变量。例如,可能有两个变量A和B,变量A是一个shell变量,变量B同时是shell变量和环境变量。但是,不能有一个只属于环境变量的变量。
那么在创建变量时又会发生什么情况呢?在Bourne shell家族,只允许创建局部变量,也就是说,每个新变量被自动设置为sehll变量。如果希望某个变量同时成为环境变量,必须使用一个称为export的特殊命令。export命令将shell变量修改为“shell+环境”变量。当这样做时,就可以称将变量导出(export)到环境中。
下面举例说明。开始时,我们创建一个名为HARLEY的变量,并将值cool赋给它:

HARLEY=cool
此时,HARLEY只是一个shell变量。如果启动一个新shell或者运行一条新命令,则新进程并不能访问HARLEY,因为它还不是环境变量。下面将HARLEY导出到环境中:

export HARLEY
现在HARLEY变量既是shell变量又是环境变量了。如果这时再启动一个新shell或者运行一条新命令,那么它们就可以访问HARLEY。
现在,大家应该可以理解为什么Bourne shell为shell变量和环境变量都使用大写字母。使用大写字母可以使变量名称突出,而且因为没有纯粹的环境变量,所以没有简单的方法来区分局部变量和全局变量。
可以看出,Bourne shell家族处理变量的方式有点使人感到混乱,特别是初学者,实际上,这些shell所使用的系统可以追溯到第一个Bourne shell,由Steve Bourne于1976年在贝尔实验室开发。两年之后,即1978年,当Bill Joy在加利福尼亚大学伯克利分校开发C-Shell时,他决定改变变量的组织方式。他创建了一个非常简明的系统,在这个系统中他对环境变量和shell变量进行了明显区分。
在C-Shell家族中,环境变量通过命令setenv创建,并且以大写字母命名,如TERM。shell变量由set命令创建,并且以小写字母命名,如user。实际上,也就是这么一回事。
但是,C-Shell家族也认识到一些特殊的变量需要既是局部变量又是全局变量。解决方法就是定义少数几个特殊的shell变量,这些变量分别绑定到对应的环境变量。无论何时,当这些变量改变时,shell会自动更新对应的变量。
例如,有一名为home的shell变量对应于环境变量HOME。如果修改home,那么,shell将对HOME进行同样的修改。如果修改HOME,那么shell也将修改home。
在所有拥有双名称的变量中,只有5个在日常应用中比较有用。现在,大家应该已经理解了TERMUSER变量。


shell变量环境变量含义
cwdPWD当前/工作目录
homeHOMEhome目录
pathPATH搜索程序的目录
termTERM正在使用的终端类型
userUSER当前用户标识

在C-Shell家族中,认为有少数几个shell变量与对应的环境变量相同。当这一对变量中有一个变量改变时,shell会自动修改另一个变量。例如,当home变量改变时,shell会自动修改HOME变量,反之亦然。

4.显示环境变量:env, printenv
尽管您可以创建自己的环境变量和shell变量,但是除非编写程序,否则并不需要这样做。大多数时候,使用的是默认的变量。
默认变量有哪些呢?为了显示默认变量,可以使用命令env:

env

在许多系统上,还有另一个命令可以使用,这个命令是printenv:

printenv

当使用env或者printenv命令时,环境变量可能有许多,以至于有些变量滚动出屏幕,如果出现这种情况,可以使用less命令每次一屏的显示输出:

env | less
printenv | less


当显示环境变量时,环境变量并不会根据字母表顺序排序。如果希望对输出排序,可以使用sort命令,如下所示:

env | sort | less
printenv | sort | less

这种结构成为“管道线(pipeline)”。
下面是最重要的环境变量及其含义。在计算机上看到的实际变量可能会由于操作系统和所使用shell的不同而有所不同。但是,大多数变量会和表中的相同。

shell变量含义
B K • •        CDPATHcd命令搜索命令
B K • TCOLUMNS屏幕或者窗口的宽度(以字符为单位)
B K C TEDITOR默认文本编辑器
B K • •ENV环境文件的名称
B K • •FCEDIT历史列表:fc命令使用的编辑器
B K • •HISTFILE历史列表:用来存储历史文件命令的文件名称
B K • •HISTSIZE历史列表:存储历史命令的最大数量
B K C THOMEhome目录
• • • THOST计算机名称
B • • •HOSTNAME计算机名称
B • • THOSTTYPE主机计算机的类型
B • • •IGNOREEOF在结束shell之前忽略的eof信号(^D)的数量
B K C TLOGNAME当前用户标识
B • • TMACHTYPE系统描述
B K C TMAIL查看新邮件的文件
B K C TMAILCHECKshell查看新邮件的时间间隔(单位为秒)
B K • •MAILPAT查看新邮件的文件
B K • •OLDPWD前一个工作目录
B • • TOSTYPE操作系统的描述
B K C TPAGER显示数据的默认程序(应该是less)
B K C TPATH搜索程序的目录
B K • •PS1shell提示(通过修改这个变量进行shell提示的定制)
B K • •PS2连续行的特殊shell提示
B K C TPWD工作[当前]目录
B K • •RANDOM0至32 767之间的随机数
B K • •                   SECONDS自shell激活之后过去的时间(单位为秒)
B K C TSHELL登录shell的路径名
B K C TTERM正在使用的终端类型
B K • •TMOUT在不键入命令时,系统自动注销前的等待时间(单位为秒)
• K C TTZ时区信息
B K C T USER当前用户标识
B K C TVISUAL默认文本编辑器(覆盖EDITOR )

默认情况下,Unix系统使用大量的环境变量。系统中的环境变量,依赖于所安装的操作系统和所使用的shell。

最左边的一列说明哪个shell支持这个变量:B=Bash; K=Korn Shell; C=C-Shell; T=Tcsh。远点表示相应的shell不支持该选项。

5.显示shell变量:set
使用不带选项或者参数的set命令可以显示所有的shell变量以及它们的值:

set

这个命令非常简单,而且适用于所有的shell。但是,这里有非常重要的一点需要记住。
对于C-Shell家族来说,shell变量都是小写字母的名称。按照定义,它们都是局部变量。
对于Bourne shell家族来说,shell变量都是大写字母名称。因此,只看变量的名称无法判定这个变量是局部变量还是全局变量。如果变量只是shell变量,那么它就是局部变量;如果变量既是shell变量又是环境变量,那么它既是局部变量又是全局变量(记住,在Bourne shell家族中,没有纯粹的全局变量)。这意味着当使用set命令显示变量时,没有蛇么简单的方法知道哪些变量已经导出到环境中。


提示: 
奇怪但真实的是:确定哪些Bourne Shell变量没有导出的唯一方法就是比较set命令和env命令的输出。如果变量位于set的输出中,但是没有位于env的输出中,那么这个变量就是shell变量。如果变量既位于set的输出中,又位于env的输出中,那么这个变量既是shell变量又是环境变量。 
很明显,这容易使人迷惑。但是,这无关紧要,因为在Bourne shell家族中并不怎么使用shell变量。诚然,在编写shell脚本时,有需要时就会创建局部(shell)变量。但是对于日常的交互式工作来说,重要的是环境变量,而不是shell变量。 
在C-Shell家族中,情况就不一样了。C-Shell家族中有大量的shell变量,其中有许多用来控制shell的行为。前面曾提到过几个这种变量:cwd, home, termuser。出于参考目的,下表列了这4个变量,以及一些我认为重要的变量。有关C-Shell家族中shell变量的完整列表 


对于C-shell家族来说,shell使用了许多特殊目的的shell变量。该表中所列举的变量是我认为最有用的。
最左边一列说明哪个shell支持这个变量,其中C=C-Shell, T=Tcsh。圆点表示相应的shell不支持该选项。

这又产生了最后一个问题。如果C-Shell家族使用shell变量控制shell的行为,那么Bourne shell家族使用什么来控制shell的行为呢?答案是一个称为“Shell选项”的精心制作系统。接下来,我们需要讨论几个与变量相关的基本概念。


6. 显示及使用shell变量的值:echo, print
使用envprintenv命令可以立即显示所有环境变量的值,而使用set命令可以显示所有shell变量。但是,许多时候只希望显示一个变量的值。在这种情况下,可以使用echo命令。
echo命令的人物就是显示赋予它的任何对象的值。例如,如果输入了:

echo I love Unix
那么将看到:

I love Unix

(到目前为止,这应该是正确的)
为了显示一个变量的值,需要使用一个$(美元符号)字符,后面跟着用花括号括起来的变量名。例如,显示变量TERM的值,可以输入:

echo ${TERM}
在自己的系统上试一试,看看得到什么结果。如果没有歧义,还可以省略掉花括号。

echo $TERM
大多数时候都是这样使用的,但是一会之后我将示范一个例子,这个例子需要使用花括号。
当我们讨论以这种方式使用变量时,一般将$字符读作“dollar”。您可能听到有人说:“If you want to display the value of the TERM variable, use the command echo-dollar-term(如果您希望显示变量TERM值,可以使用命令echo-dollar-term )。”
表示$NAME非常重要,因此我希望您记住它,当您值键入一个变量的名称时,它就是一个名称;当您键入一个$字符,后面跟一个名称时(如$TERM),它指的是该变量的值。因此,前面的echo命令意味着:“显示变量TERM的值。”
考虑下面的例子,这个例子与前面的例子相似,只是没有$字符。在这个例子中,echo命令只显示字符串TERM,并不显示变量TERM的值:

echo TERM
您可以使用echo命令以自己希望的任意方式显示变量和文本。例如,下面是一条显示终端类型的命令,该命令显示的信息更加丰富:



echo The terminal type is $TERM
假设您的终端类型是xterm,那么您将看到:

The terminal type is xterm

在shell中,一些标点符号字符为“元字符”,它们拥有特殊的含义。为了防止shell解释元字符,需要将元字符包含在双引号中。这就告诉shell照字面意义接受字符。例如,为了显示尖括号中的TERM值。您可以输入下述命令:

echo The terminal type is <$TERM>.

但是,<和>字符是元字符,表示“重定向”,所以该命令不能正常运行。为此,您需要使用:

echo “The terminal type is <$TERM>.”

提示:
当使用echo命令显示标点符号时,使用双引号告诉shell不要将标点符号解释为元字符。
在使用echo命令时拥有极大的灵活性。例如,可以显示不止一个变量:

echo $HOME $TERM $PATH $SHELL

如果希望使用一个与它的邻居不分开的变量,则必须使用花括号为它划清界限。例如,假设变量ACTIVITY的值为stuff。那么命令:

echo “My favorite sport is ${Activity}ing.”


将显示:


My favorite sport is surfing
提示:
如果编写shell脚本,将会发现必须大量地使用echo命令。花一点时间查阅说明书页(man echo),说明书页中有许多选项和特性说明,借助它们可以控制输出的格式和内容。
7. Bourn shell使用家族使用变量:export, unset 
对于Bourn shell家族,创建变量非常简单。所需做的全部事情即使键入一个名称,后跟一个=(等号)字符,再后跟一个值。变量的值必须是字符串。创建变量的语法为:

NAME=value


正如前面所述,变量名可以使用字母,数字或者下划线(_)。但是,变量名的第一个字符不能是数字。

下面举例说明,您自己可以试一试。一定确保不再等号两边加空格:

HARLEY=cool


当以这种方式创建变量是,我们就说您设置了变量。因此,我们可以说上一个例子设置了变量HARLEY,并给变量HARLEY赋予了一个值:cool。

如果希望使用一个包含有空白符的值,则需要将值放在双引号中:

WEEDLY=“a cool cat”


如果变量存在,还可以使用相同的语法修改变量的值。例如,一旦已经创建了变量HARLEY,那么使用下述命令就可以将该变量的值由cool修改为smart:


HARLEY=smart


在Bourn shell家族中,每个新变量都自动地被设置成shell变量。使用export命令可以将变量导出到环境中。导出时键入export,后面跟一个或者多个变量的名称。下面的例子导出变量HARLEY和WEEDLY。


export HARLEY WEEDLY


HARLEY和WEEDLY变量同时由shell变量变为“shell+环境”变量。

我们之前见过,使用一个分号将各条命令分隔开,可以在命令行上输入多条命令。因为创建一个变量,然后立即导出这个变量非常常见,所以一起输入两条命令非常有用,例如:

PAGER=less; export PAGER


这种方式要比输入两条单独的命令快一些,所以这种模式经常使用,特别是在Unix文档资料和shell脚本中。但是,还有一个更好的方法。export命令实际上允许同时设置变量并导出到环境中。该命令的语法为:


export NAME[=value]…


下面举一个简单例子:


export PAGER=less


仔细看看该语法。注意export允许指定一个或多个变量名,还可以为每个变量名指定一个值。因此使用一条命令就可以导出许多变量:


export HARLEY WEEDLY LITTLENTIPPER


export PAGER=less EDITOR=vi PATH=“/user/local/bin:/usr/bin:/bin”



提示
通常,最出色的Unix用户脑筋转得比较快。同时,他们还喜欢采用尽可能简单的方式键入命令。基于这一原因,首选的方法就是用一条命令设置并导出变量:

export PAGER=less


尽管许多人使用两条命令来设置好导出变量,但是使用一条命令完成两份作业可以显示出您是一个聪明的人,与众不同的人。





正如前面所述,当创建变量是,我们称这是在设置变量。当删除变量时,我们称这是在复位(unset)变量。变量极少需要复位,但是如果需要的话,则可以使用unset命令。该命令的语法比较简单:


unset NAME…


下面举例说明:


unset HARLEY WEEDLY
提示:
更有趣的时,在Bourne shell家族中,没有简单的方法从环境中移除变量。一旦变量导出,收回该变量的唯一方法就是复位该变量。
换句话说,从环境中移除一个Bourne shell变量的唯一方法就是销毁这个变量。
8. C-shell家族使用变量:setenv, unsetenv, set, unset
与Bourne shell家族不同,C-shell家族在环境变量和shell变量之间有一个清晰的界限。换句话说,C-shell明确区分全局变量和局部变量。基于这一原因,在C-shell家族中使用变量要比在Bourne shell家族中使用变量简单一些。
在C-shell家族中,使用setenvunsetenv命令可以设置(创建)或复位(删除)环境变量。设置或复位shell变量时,需要使用setunset命令。

setenv命令的语法如下所示:


setenv NAME [value]


其中NAME是变量,value是希望为变量设置的值。注意,该命令中未使用=(等号)字符。

下面举一些创建环境变量的例子。如果您希望体验一下,那么请记住,一旦创建了环境变量,就可以使用envprintenv命令显示它们。

setnv PATH/usr/local/bin:/usr/bin:/bin

setnv HARLEY cool
setnv WEDDLY “a cool cat”
setnv LITTLENTPPER

前3条命令分别设置一个变量并指定变量的值。在第三个例子中,使用了双引号,从而将空白符(两个空格)包含进去。在最后一个例子中,指定了一个变量名(LITTLENIPPER),但是没有指定值。这将创建一个值为null的变量。当只关心某个变量是否存在,但不关心它的值时,我们就可以这样做。

复位环境变量可以使用unsetenv命令。该命令的语法如下所示:

unsetenv NAME


其中NAME是变量名。

例如,复位(删除)变量HARELY,可以使用:

unsetenv HARELY


设置shell变量可以使用set命令,该命令的语法如下所示:


set name[=value]


其中name是shell变量名,value是希望设置给变量的值。

下面举例说明:

set term=vt100

set path=(/usr/bin / bin /usr/ucb)
set ignoreeof

第一个例子很简单,只是将shell变量term的值设置为vt100。

第二个例子描述了一个重点。当在C-shell家族中使用变量时,使用圆括号将一组字符串括起来,而不是使用双引号。这样实际上就是定义了一组可以单独访问的字符串。在这个例子中。path的值被设置为圆括号中的3个字符串。
在最后一个例子中,我们制定了一个没有值的shell变量。该命令创建了一个值为null的变量。在这个例子中,变量ignoreeof存在就说明shell忽略eof信号。这将要求用户使用logout命令结束shell。
一旦变量存在,就可以使用unset命令删除这个shell变量。语法如下:

unset variable


其中variable是变量名。

下面举例说明。如果希望告诉shell关闭ignoreeof特性,可以使用:

unset ignoreeof


请确保自己理解了将变量设置为null和删除变量之间的区别。考虑下面3条命令:


set harley=cool

set harley
unset harley

第一条命令创建一个名为harley的shell变量,并将该变量的值指定为cool。第二条命令将变量harley的值设置为null。最后一条命令完全删除变量harley。

沒有留言:

張貼留言