IT技术博客大学习 共学习 共进步

Linux的shell变量

ilonng 2009-10-12 10:03:37 浏览 3,601 次

Linux的变量可分为两类:环境变量和本地变量

环境变量,或者称为全局变量,存在与所有的shell中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了。Linux的环境变量具有继承性,即子shell会继承父shell的环境变量。

本地变量,当前shell中的变量,很显然本地变量中肯定包含环境变量。Linux的本地变量的非环境变量不具备继承性。

Linux中环境变量的文件

    当你进入系统的时候,linux就会为你读入系统的环境变量,这些环境变量存放在什么地方,那就是环境变量的文件中。Linux中有很多记载环境变量的文件,它们被系统读入是按照一定的顺序的。

    /etc/profile

此文件为系统的环境变量,它为每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。

    这个文件,是任何用户登陆操作系统以后都会读取的文件(如果用户的shell是csh、tcsh、zsh,则不会读取此文件),用于获取系统的环境变量,只在登陆的时候读取一次。

    假设用户使用的是BASH,那么

    /etc/bashrc

在执行完/etc/profile内容之后,如果用户的SHELL运行的是bash,那么接着就会执行此文件。另外,当每次一个新的bash shell被打开时,该文件被读取。

    每个使用bash的用户在登陆以后执行完/etc/profile中内容以后都会执行此文件,在新开一个bash的时候也会执行此文件。因此,如果你想让每个使用bash的用户每新开一个bash和每次登陆都执行某些操作,或者给他们定义一些新的环境变量,就可以在这个里面设置。

    ~/.bash_profile

每个用户都可使用该文件输入专用于自己使用的shell信息。当用户登录时,该文件仅仅执行一次,默认情况下,它设置一些环境变量,执行用户的.bashrc文件。

    单个用户此文件的修改只会影响到他以后的每一次登陆系统。因此,可以在这里设置单个用户的特殊的环境变量或者特殊的操作,那么它在每次登陆的时候都会去获取这些新的环境变量或者做某些特殊的操作,但是仅仅在登陆时。

    ~/.bashrc

该文件包含专用于单个人的bash shell的bash信息,当登录时以及每次打开一个新的shell时,该该文件被读取。

    单个用户此文件的修改会影响到他以后的每一次登陆系统和每一次新开一个bash。因此,可以在这里设置单个用户的特殊的环境变量或者特殊的操作,那么每次它新登陆系统或者新开一个bash,都会去获取相应的特殊的环境变量和特殊操作。

~/.bash_logout

当每次退出系统(退出bash shell)时,执行该文件。

几个命令

    env和printenv

    这两个变量用于打印所有的环境变量:

[root@devdb1 worksh]# env

HOSTNAME=devdb1

TERM=vt100

..........................................................

OLDPWD=/root

[root@devdb1 worksh]# printenv

HOSTNAME=devdb1

TERM=vt100

..........................................................

OLDPWD=/root

[root@devdb1 worksh]#

    另外,env变量还有其他的功能,如下:

env [-i|-] [name=value] [command [argument]]

这里的“-i”或者“-”,都是表示忽略继承的环境变量;这里的name=value,用于指定本地变量对,可以有多组;整个命令的含义是,忽略继承的环境变量,设定多组name变量,在此基础上运行命令command。如

env -i test="test" bash -c \'echo $SHELL; env\'

/bin/bash

PWD=/home/oracle

test=test

SHLVL=1

_=/bin/env

很显然,这里新运行bash并没有继承环境变量,但是却设置了本地变量test。

    set

    用于显示与设置当前本地变量。单独一个set就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量,如:

[oracle@devdb1 oracle]$ set

BASH=/bin/bash

BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")

BASH_VERSION=\'2.05b.0(1)-release\'

BDUMP=/opt/oracle/admin/devdb/bdump

COLORS=/etc/DIR_COLORS

COLUMNS=132

DIRSTACK=()

EUID=500

GROUPS=()

G_BROKEN_FILENAMES=1

HISTFILE=/home/oracle/.bash_history

HISTFILESIZE=1000

HISTSIZE=1000

HOME=/home/oracle

.............................

    set很有很多其他的选项,具体请参考man set。

    unset

    用于清除变量。不管这个变量是环境变量还是本地变量,它都可以清除。

-- 下面是清除本地变量

[oracle@devdb1 oracle]$ set|grep myname

myname=ilonng

[oracle@devdb1 oracle]$ unset myname

[oracle@devdb1 oracle]$ set|grep myname

-- 下面是清除环境变量

[oracle@devdb1 oracle]$ env|grep myname

myname=ilonng

[oracle@devdb1 oracle]$ unset myname

[oracle@devdb1 oracle]$ env|grep myname

    export

用于把变量变成当前shell和其子shell的环境变量,存活期是当前的shell及其子shell,因此重新登陆以后,它所设定的环境变量就消失了。如何将环境变量永久化?修改上面介绍的那几个环境变量的配置文件。

[oracle@devdb1 oracle]$ export myname=ilonng

[oracle@devdb1 oracle]$ env|grep myname

myname=ilonng

[oracle@devdb1 oracle]$ bash

[oracle@devdb1 oracle]$ env|grep myname

myname=ilonng

[oracle@devdb1 oracle]$ exit

exit

[oracle@devdb1 oracle]$ env|grep myname

myname=ilonng

    source

当直接执行一个脚本的时候,其实是在一个子shell环境运行的,即开启了一个子shell来执行这个脚本,脚本执行完后该子shell自动退出。

有没有办法在当前shell中执行一个脚本呢?使用source命令就可以让脚本在当前shell中执行。如:

[oracle@dbamonitor NBU]$ cat test.sh   -- 查看脚本内容,显示变量内容

echo $myname

[oracle@dbamonitor NBU]$ echo $myname  -- 变量存在,内容是ilonng

ilonng

[oracle@dbamonitor NBU]$ set |grep myname -- 变量是本地变量

myname=ilonng

[oracle@dbamonitor NBU]$ env |grep myname -- 变量不是环境变量

[oracle@dbamonitor NBU]$ sh test.sh  -- 直接执行,新开子shell,非环境变量的本地变量不具备继承性,在子shell中不可见

  -- 这里什么都没有输出

[oracle@dbamonitor NBU]$ source test.sh -- source命令,是脚本在当前shell中执行

ilonng

建议继续学习

  1. Axure之变量的使用 (阅读 5,041)
  2. 深入PHP使用技巧之变量 (阅读 4,660)
  3. 从shell中向awk传递变量实例 (阅读 4,480)
  4. 变量在内存中的位置 (阅读 3,781)
  5. c语言全局变量和局部变量问题汇总 (阅读 3,582)
  6. PHP的可变变量名 (阅读 3,242)
  7. 详解Linux bash中的变量 (阅读 3,202)
  8. PHP 中对变量unset,可以销毁变量中的资源 (阅读 2,921)
  9. 如何获取一个变量的名字 (阅读 2,822)