13.1.2 环境变量

环境变量通常又称“全局变量”,以区别于局部变量。在Shell脚本中,变量默认就是全局的,无论在脚本的任何位置声明,但是为了让子Shell继承当前Shell的变量,则可以使用export内建命令将其导出为环境变量。该命令的使用方法如下:


  1. [root@localhost ~]# export VAR=value

其中,VAR是变量的名字,value为值,使用等号相连,注意等号两端没有空格。

13.1.2 环境变量 - 图1

图13-1 局部变量作用域演示

环境变量可用在创建变量的Shell和从该Shell派生的任意子Shell或进程中(使用export内建命令将变量导出为环境变量),因此,环境变量通常又被称作全局变量。环境变量被创建时所处的Shell被称为父Shell,如果在父Shell中再创建一个Shell,则该Shell被称作子Shell。当子Shell产生时,它会继承父Shell的环境变量为自己所用,所以说环境变量可从父Shell传给子Shell。不难理解,环境变量还可以传递给孙Shell。请注意,环境变量只能向下传递而不能向上传递,即“传子不传父”。在一个Shell中创建子Shell最简单的方式是运行bash命令,如图13-2所示。

13.1.2 环境变量 - 图2

图13-2 创建子Shell

为了演示环境变量对子Shell的影响,这里安排一个小实验。请读者使用SSH远程连接到一台服务器,输入用户名、密码后,将得到一个登录Shell,为方便起见,将其命名为父Shell;在该Shell中输入命令bash并回车,这时候进入子Shell;在子Shell中,声明一个环境变量export VAR=1,并确认VAR已经正确赋值(echo VAR);然后在子Shell中再输入命令bash并回车,这时候进入孙Shell(也就是子Shell的子Shell,捋顺一下思绪,千万别乱了)。现在在孙Shell中使用echo VAR命令,发现可以打印出正确的值,这说明子Shell中的环境变量确实可以传递给孙Shell。最后,连续输入两次exit命令依次退出孙Shell和子Shell,进入父Shell中,此时再使用echo VAR命令,发现父Shell并没有这个值,这说明子Shell的环境变量并不能传递给父Shell,如图13-3所示。

bash中默认包含有几十个预设的环境变量,这里挑选常见的一些予以介绍。读者此处可以迅速浏览一遍,留个印象,今后在使用的过程中再慢慢熟悉。可以通过echo的方式查看这些变量的值。

13.1.2 环境变量 - 图3

图13-3 环境变量的继承关系

变量:BASH

说明:Bash Shell的全路径。


  1. [root@localhost ~]# echo $BASH
  2. binbash

变量:BASH_VERSION

说明:Bash Shell的版本。


  1. [root@localhost ~]# echo $BASH_VERSION
  2. 3.2.25(1)-release

变量:CDPATH

说明:用于快速进入某个目录。在Linux管理中我们可能经常要进入网络配置的目录(etcsysconfig/network-scripts/)中修改配置文件,但由于目录名较长,每次进入该目录都显得非常困难,如下所示:


  1. [root@localhost ~]# cd etcsysconfig/network-scripts/

使用CDPATH变量,可以迅速地进入该目录,如下所示:


  1. [root@localhost ]# CDPATH="etcsysconfig/"
  2. #
  3. 注意这里执行cd network-scripts
  4. 时,先会在当前目录中查找是否有network-scripts
  5. 如果有,将会进入当前目录中的network-scripts
  6. 目录;如果没有,才会进入CDPATH
  7. 定义的
  8. 目录中的network-scripts
  9. 目录
  10. [root@localhost ]# cd network-scripts
  11. etcsysconfig/network-scripts

变量:EUID

说明:记录当前用户的UID。当前的用户是root,所以该值应该为0。


  1. [root@localhost ~]# echo $EUID
  2. 0

变量:FUNCNAME

说明:在用户函数体内部,记录当前函数体的函数名。创建funcname.sh文件,内容如下(运行该脚本后注意查看脚本的输出):


  1. [root@localhost ~]# cat funcname.sh
  2. #!binbash
  3. funcname() {
  4. echo $FUNCNAME
  5. }
  6. funcname
  7. [root@localhost ~]# bash funcname.sh
  8. funcname

变量:HISTCMD

说明:记录下一条命令在history命令中的编号。如果运行history命令查看到history中一共记录了1016条已经执行过的命令,则下面一条命令的编号将是1018(因为本次history为第1017条命令)。


  1. [root@localhost ~]# history
  2. ......(
  3. 略去内容)......
  4. 1016 history
  5. [root@localhost ~]# echo $HISTCMD
  6. 1018

变量:HISTFILE

说明:记录history命令记录文件的位置。运行history命令将打印出已经运行过的命令列表,即便重启机器之后还能保存以前的命令记录。但这是如何做到的呢?其实history只不过是找到$HISTFILE所指定的命令记录文件,并将其打印出来。一般默认每个用户的家目录下都有一个.bash_history文件,用于记录该用户运行过的命令历史记录。


  1. [root@localhost ~]# echo $HISTFILE
  2. root.bash_history

变量:HISTFILESIZE

说明:设置HISTFILE文件记录命令的行数。

如果任凭HISTFILE文件不断增大,显然会有一天这个文件将大到不可收拾,而且也没有必要记录那么多命令,所以使用某种机制限制该文件的大小是非常必要的,HISTFILESIZE就起着这样的作用。


  1. [root@localhost ~]# echo $HISTFILESIZE
  2. 1000

变量:HISTSIZE

说明:事实上Linux并不会每次运行一个命令后立即将该命令记录到HISTFILE文件中,读者可以试着在当前的Shell中多运行几次命令,然后用catroot.bash_history命令查看。原因是Shell采用了“命令缓冲区”来记录所有已运行过的命令,在缓冲区满或退出Shell时才将缓冲区的记录写到HISTFILE文件中。缓冲区的大小使用HISTSIZE定义。


  1. [root@localhost ~]# echo $HISTSIZE
  2. 1000

变量:HOSTNAME

说明:展示主机名。这个很简单,直接看代码,如下所示:


  1. [root@localhost ~]# echo $HOSTNAME
  2. localhost.localdomain

变量:HOSTTYPE

说明:展示主机的架构,是i386、i686,还是x86_64等。代码如下:


  1. [root@localhost ~]# echo $HOSTTYPE
  2. i686

变量:MACHTYPE

说明:主机类型的GNU标识,这种标识有统一的结构。一般来说是“主机架构-公司-系统-gnu”,在RedHat系统中打印该变量值,如下所示:


  1. [root@localhost ~]# echo $MACHTYPE
  2. i686-redhat-linux-gnu

变量:LANG

说明:设置当前系统的语言环境,其实就是language的意思。


  1. #
  2. 显示当前语言环境
  3. [root@localhost ~]# echo $LANG
  4. en_US.UTF-8
  5. #
  6. 设置语言环境为中文
  7. [root@localhost ~]# export LANG=zh_CN.UTF-8

变量:PWD

说明:记录当前目录。


  1. [root@localhost ~]# echo $PWD
  2. /root

变量:OLDPWD

说明:记录之前目录,这个值是什么由之前所在的那个目录决定。


  1. #
  2. 进入/mnt
  3. 目录
  4. [root@localhost ]# cd mnt
  5. #
  6. 进入root
  7. 目录
  8. [root@localhost mnt]# cd
  9. #
  10. 看看之前在哪个目录
  11. [root@localhost ]# echo $OLDPWD
  12. /mnt

变量:PATH

说明:这个变量在本书中多次出现了,代表命令的搜索路径,非常重要。前面的章节中已经很详细地描述了它的含义和用法,读者一定要理解并掌握。


  1. #
  2. 查看当前PATH
  3. 的值
  4. [root@localhost ]# echo $PATH
  5. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/
  6. bin:/sbin:/bin:/usr/sbin:/usr/bin:rootbin
  7. #
  8. 重设PATH
  9. 变量,增加/some/path
  10. 至原来的PATH
  11. [root@localhost ]# export PATH=/some/path:$PATH

变量:PS1

说明:命令提示符,默认值是[\u@\h\W]\$,其中\u是用户名、\h是主机名、\W是当前工作目录的basename、\$是用户UID的替换字符:如果UID是0则替换成“#”,否则替换成“$”,所以此处具体显示出来就是“[root@localhost~]#”。该变量可以有很多种组合,可以根据自己的喜好进行定制。但是毕竟它没有太大的实际用途,所以不需要读者浪费太多时间学习。表13-1列举了一些可用的符号,供读者参考。

表13-1 一些命令提示符

13.1.2 环境变量 - 图4

Shell预设的变量还有很多,读者可以使用man bash查看man文件,在Shell Variables章节中可具体查看每个变量的含义。表13-2中简要描述了之前未讲到的预设变量及其用途。

表13-2 一些预设变量

13.1.2 环境变量 - 图5

13.1.2 环境变量 - 图6

13.1.2 环境变量 - 图7