1.Shell变量的分类
Shell变量大致可以分为以下3类。
●内部变量:由系统提供,用户只能使用,不能修改。
●环境变量:这些变量决定了用户工作的环境,不需要用户定义,可以直接在Shell中使用,其中某些变量用户可以修改。
●用户变量:由用户建立和修改,也称用户自定义变量。在Shell脚本编写中会经常用到。
2.Shell变量的定义和输出
Shell支持具有字符串值的变量。Shell变量不需要专门的定义和初始化语句。一个没有初始化的Shell变量被认为是空字符串。通常通过赋值语句完成变量说明并予以赋值,并且可以给一个变量多次赋值以改变其值。
在Shell中,变量的赋值使用如下语法格式。
其中:
●name是变量名,变量名是以字母或下画线开头的字母、数字和下画线字符序列。用户自定义变量按照惯例使用小写字母命名。
●“=”是赋值符号。两边不能有空格,否则Shell将视为命令。
●string是被赋予的变量值。若string中包含空格、制表符和换行符,则string必须用'string'或"string"的形式,即用单(双)引号将其括起来。双引号内允许变量替换,而单引号则不可以。
通过在变量名(name)前加$字符,即用$name的形式引用变量的值,引用的结果就是用字符串string代替$name。此过程也称为变量替换。在字符串连接过程中为了界定变量名、避免混淆,变量替换也可以使用${name}的形式。
变量输出可使用Shell的内置命令echo(常用)或printf(用于格式化输出,类似C语言的printf())。
下面给出一个定义和使用Shell变量的例子。
操作步骤2.1 定义和使用Shell变量举例
3.Shell变量的作用域
Shell变量有其规定的作用范围。Shell变量分为局部变量和全局变量。所有自定义变量默认都是局部变量;环境变量则是全局变量。
●局部变量的作用范围仅限制在其命令行所在的Shell或当前Shell脚本执行过程中。
●全局变量的作用范围则包括定义该变量的Shell及其所有子Shell。
可以使用export内置命令将局部变量设置为全局变量。export的常用格式为:
下面给出一个Shell变量作用域的例子。
操作步骤2.2 Shell变量作用域举例
重点
(1)在当前Shell中要想使用父Shell中的变量,至少要在当前Shell的父Shell中设置为全局变量。
(2)变量在子Shell中值的修改不会传回父Shell。
4.Shell环境变量
环境变量定义Shell的运行环境,保证Shell命令的正确执行。Shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。所有环境变量都是全局变量(即可以传递给子Shell),并可以由用户重新设置。表2-35列出了一些系统中常用的环境变量。
表2-35 Shell中常用的环境变量
这些变量都是可写的,用户可以为它们赋任何值。如要使用自己的环境变量,则应该使用前面介绍的export命令。
提示
1.用户还可以使用不带任何参数的env、printenv或export命令,显示当前定义的所有环境变量。
2.要取消一个环境变量的声明或赋值,也可以使用unset命令。
5.设置用户工作环境
用户登录系统时,Shell为用户自动定义唯一的工作环境,并对该环境进行维护直至用户注销。该环境将定义如身份、工作场所和正在运行的进程等特性。这些特性由指定的环境变量值定义。
Shell环境与办公环境相似,在办公室中每个人所处环境的物理特性,有些是相同的,如灯光和温度,但又有许多因素是个人特有的,如日常工作和个人工作空间,因此用户自己的工作环境就有别于其他用户的工作环境。正如一个用户的Shell环境不同于其他用户的Shell环境。
用户工作环境还有登录环境和非登录环境之分。登录环境是指用户登录系统时的工作环境,此时的Shell对登录用户而言是主Shell。非登录环境是指用户在调用子Shell时所使用的用户环境。
用户并不需要每次登录后都对各种环境变量进行手工设置,通过环境设置文件,用户的工作环境的设置可以在登录的时候自动由系统来完成。环境设置文件有两种,一种是系统环境设置文件,另一种是个人环境设置文件。
(1)系统中的用户工作环境设置文件(对所有用户均生效)
●登录环境设置文件:/etc/profile。
●非登录环境设置文件:/etc/bashrc。
(2)用户设置的环境设置文件(只对用户自身生效)
●登录环境设置文件:$HOME/.bash_profile。
●非登录环境设置文件:$HOME/.bashrc。
提示
1.工作环境设置文件是Shell脚本文件。
2.用户可以修改自己的用户环境设置文件,来覆盖在系统环境设置文件中的全局设置。例如:
(1)用户可以将自定义的环境变量存放在$HOME/.bash_profile中。
(2)用户可以将自定义的别名存放在$HOME/.bashrc中,以便在每次登录和调用子Shell时生效。
1.自动补全命令行
为了减少键盘输入次数,bash提供了命令行自动补全功能,随时按下〈Tab〉键,bash就能判断出用户所要自动补全的对象。可以自动补全的对象有:
●命令名(包括命令别名、Shell函数名)。
●Shell变量(bash将以$开头的补全对象视为Shell变量)。
●用户名(bash将以~开头的补全对象视为用户名,并解析为用户的家目录)。
●主机名(bash将以@开头的补全对象视为主机名,并从/etc/hosts中查找补全对象)。
下面给出一些命令行补全的例子。
操作步骤2.3 命令行补全的例子
2.命令历史
bash可以记录一定数目的以前在Shell中输入的命令。可以记录历史命令的数目由环境变量HISTSIZE的值指定。记录历史命令的文本文件由环境变量HISTFILE来指定,默认的记录文件是.bash_history,这是一个隐含文件,位于用户的宿主目录下。
仅将先前的命令存在历史文件里是没有用的,将历史命令记录后,用户如何使用它们呢?有如下几种方式:
●最简单的方法是用上下方向键、〈PgUp〉键和〈PgDn〉键来查看历史命令。
●如果需要,可以使用键盘上的编辑功能键对显示在命令行上的命令进行编辑。
●用history命令来显示和编辑历史命令。
●用!<命令事件号>执行已经运行过的命令。
●用!<已经使用过的命令前面的部分>执行已经运行过的命令。
下面给出一个使用命令历史操作的例子。
操作步骤2.4 使用命令历史操作的例子
3.命令别名
命令别名是bash提供的另一个使用户的工作变得轻松的方法。命令别名通常是其他命令的缩写,用来减少键盘输入。同时也允许用户为命令另外取一个自己习惯使用的名字。
可以使用alias命令来达到上述目的。命令格式为:
其中alias_name是用户给命令取的别名,original_command是原来的命令和参数。不使用任何参数来使用alias命令,将显示当前的别名和其对应的原始命令。下面给出几个使用命令别名操作的例子。
操作步骤2.5 使用命令别名操作的例子
注意
1.在定义别名时,等号两边不允许有空格存在,否则bash将不能确定用户的意图。若命令中包含空格或其他的特殊字符串,则必须使用引号。
2.若系统中有一个命令,同时又定义了一个与之同名的别名(例如,系统中有ls命令,且又定义了ls的别名),则别名将优先于系统中原有命令的执行。要想临时使用系统中的命令而非别名,应该在命令前添加转义符“\”,例如,\ls命令将运行系统中原来的ls命令而不是ls别名,它不区分文件类型和颜色。
3.如果用户需要别名的定义在每次登录时均有效,应该将其写入用户私有目录下的.bashrc文件中。
1.重定向
Linux命令在执行时常常期望接收输入数据,命令执行后又期望将产生的数据结果输出。Linux的大部分命令都具有标准的输入/输出设备端口。表2-36中列出了标准设备。
表2-36 标准设备
所谓重定向,就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为输入重定向、输出重定向和错误重定向。通常情况下重定向到一个文件。在Shell中,要实现重定向主要依靠重定向符实现,即Shell是检查命令行中有无重定向符来决定是否需要实施重定向。表2-37中列出了常用的重定向符。
表2-37 常用的重定向符
下面给出几个使用重定向操作的例子。
操作步骤2.6 使用重定向操作的例子
2.管道
许多Linux命令具有过滤特性,即一条命令通过标准输入端口接收一个文件中的数据,命令执行后产生的结果数据又通过标准输出端口送给后一条命令,作为该命令的输入数据。后一条命令也是通过标准输入端口而接收输入数据。
Shell提供管道命令“|”将这些命令前后衔接在一起,形成一个管道线,格式为:
管道线中的每一条命令都作为一个单独的进程运行,每一条命令的输出作为下一条命令的输入。由于管道线中的命令总是从左到右顺序执行的,因此管道线是单向的。
管道线的实现创建了Linux系统管道文件并进行重定向,但是管道不同于I/O重定向,输入重定向导致一个程序的标准输入来自某个文件,输出重定向是将一个程序的标准输出写到一个文件中,而管道是直接将一个程序的标准输出与另一个程序的标准输入相连接,不需要经过任何中间文件。下面给出几个使用管道操作的例子。
操作步骤2.7 使用管道操作的例子
3.命令替换
Shell中的命令参数可以由另一个命令执行的结果来替代。使用的格式如下:
其中,cmd2 arguments的输出作为cmd1的参数。
注意
cmd2要放在反引号“`”里。请注意反引号“`”和单引号“'”的区别,它们在功能上并不相同。
下面给出几个使用命令替换的例子。
操作步骤2.8 使用命令替换的例子
4.命令组合
除了可以使用管道连接若干命令之外,还可以在一个命令行上使用若干Shell的元字符将若干命令组合在一起,表2-38中列出了这些命令组合的方法及其说明。
表2-38 命令组合
下面给出几个使用命令组合的例子。
操作步骤2.9 使用命令组合的例子
注意
当Here文件的内容包含变量替换和命令替换时,必须对$使用转义符\$,否则会将变量替换和命令替换的结果存入输出重定向的文件。行尾的续行符\,也应该使用转义的\\,在使用Here文件形式生成Shell脚本时特别有用。