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

转贴自  http://hi.baidu.com/qishudong/blog/item/fd56b853455d3d090df3e34e.html

 

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

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

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

Linux 中环境变量的文件

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

1.    /etc/profile

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

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

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



2.    /etc/bashrc

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

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



3.    ~/.bash_profile

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

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



4.    ~/.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 中不可见

-- 这里什么都没有输出

 

 

 

一、Shell变量分为本地变量和环境变量。
   1、本地变量 -- 在用户现有运行的脚本中使用
   1) 定义本地变量 格式: variable-name=value
   例子:[root@jike1 /root]# LOCALTEST="test"
   [root@jike1 /root]# echo $LOCALTEST test
   2) 显示本地变量 格式: set
   例子:[root@chinaitlab root]# set
   3) 清除本地变量 格式:unset variable-name
   例如:[root@jike1 /root]# unset LOCALTEST
   此时再执行echo $LOCALTEST将看不到变量LOCALTEST的输出。
  
   2、环境变量 -- 在所有的子进程中使用
   1) 定义环境变量 格式: export variable-name=value (与本地变量的定义相比,多了一个export关键字)
   例子:[root@chinaitlab /root]# export DOMAIN="chinaitlab.com"
   [root@ chinaitlab shell]# vi testenv.sh
   #!/bin/bash
   echo $DOMAIN
   [root@chinaitlab shell]# chmod +x testenv.sh
   [root@chinaitlab shell]# ./testenv.sh
   chinaitlab.com
   2) 显示环境变量 格式: env (本地变量的显示使用set,环境变量的显示使用env)
   例子: [root@chinaitlab test]# env
   3) 清除环境变量 格式:unset variable-name (用法与本地变量相同,都使用unset)
   例子: [root@chinaitlab shell]# unset DOMAIN
   此时再执行./testenv.sh将看不到变量DOMAIN的输出。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值