Linux 环境变量

第6章 使用Linux环境变量

6.1 什么是环境变量
bash shell用一个叫作环境变量的特性来存储有关shell会话和工作环境信息。这项特性允许你在内存中存储数据,一遍程序或shel中运行的脚脚本能够轻松访问到它们。这也是存储持久数据的一种简便方法。
在bash shel中,环境变量分为两类:
全局变量、局部变量。
怎么查看和使用环境变量
6.1.1 全局环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。这让全局环境变量对那些所创建的子shell需要获取父shell信息的程序来说非常有用。
系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。
查看全局变量,可以使用env或者printenv命令。
要显示个别环境变量的值,可以使用printenv命令。

 [hadoop@a ~]$ printenv HOME
/home/hadoop

也可以使用echo显示变量的值。在这种情况下饮用某个环境变量的时候,必须在变量前面加上一个美元符($)。

[hadoop@a ~]$ echo $HOME
/home/hadoop

在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。

[hadoop@a~]$ ls $HOME
apache-storm-version  jetty-*  hadoop
[hadoop@a~]$ ls /home/hadoop
apache-storm-version  jetty-*  hadoop

正如前面提到的,全局环境变量可用于进程的所有子shell。

[hadoop@a~]$ bash
[hadoop@a ~]$ echo $HOME
/home/hadoop
[hadoop@a ~]$ exit
exit

在这个例子中,用bash命令生成一个子shell后,显示了HOME环境变量的当前值,这个值和父shell中的一模一样,都是/home/hadoop
6.1.2 局部变量
顾名思义,局部环境变量只能在定义他们的进程中可见。自己定义的局部变量,被称为用户定义局部变量。
在Linux系统并没有一个只显示局部环境变量的命令。
set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

命令显示结果
set显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序
printenv和env显示出全局变量。不会对变量排序

6.2设置用户定义变量
怎么在交互式shell或shell脚本程序中创建自己的变量并引用它们。
6.2.1 设置局部用户定义变量
一旦启动了bash shel(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。通过等号给环境变量赋值,值可以是数值或字符串(值中含有空格,必须使用引号来界定字符串的首和尾)
设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个shell,它在子shell中就不可用。

[hadoop@localhost ~]$ echo $de_home

[hadoop@localhost ~]$ de_home = 'zhu zhu zhu'
-bash: de_home: command not found
[hadoop@localhost ~]$ 
[hadoop@localhost ~]$ de_home='zhu zhu zhu'
[hadoop@localhost ~]$ echo $de_home
zhu zhu zhu
[hadoop@localhost ~]$ 
[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $de_home

[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ echo $de_home
zhu zhu zhu
[hadoop@localhost ~]$ exit

类似地,如果你在子进程中设置了一个局部变量,那么一旦你退出子进程,那个局部环境变量就不可用。

[hadoop@localhost ~]$ echo $my_child_variable

[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ my_child_variable='Hello Little World'
[hadoop@localhost ~]$ echo $my_child_variable
Hello Little World
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ echo $my_child_variable

[hadoop@localhost ~]$ 

当我们回到父shell时,子shell中设置的局部变量就不存在了。可以通过将局部的用户定义变
量变成全局变量来改变这种情况。

注:
所有的系统环境变量名均使用大写字母,这是bash shell的标准惯例。
如果是你自己创建的局部变量或是shell脚本,请使用小写字母。
变量名区分大小写。
在涉及用户定义的局部变量的时候坚持使用小写字母,这能避免重新定义系统变量可能带来的灾难。
6.2.2 设置全局环境变量
在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方法是先创建一个局部环境白能量没然后再把它导出到全局变量中。
这个过程通过export命令来完成,变量名前不需要加$

[hadoop@localhost ~]$ echo $my_child_variable

[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ my_child_variable='Hello Little World'
[hadoop@localhost ~]$ echo $my_child_variable
Hello Little World
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ echo $my_child_variable

[hadoop@localhost ~]$ 
[hadoop@localhost ~]$ 
[hadoop@localhost ~]$ 
[hadoop@localhost ~]$ my_variable='I am Gloabl now'
[hadoop@localhost ~]$ export my_variable
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ 

修改子shell中全局环境变量并不会影响到父shell中该变量的值。

[hadoop@localhost ~]$ my_variable='I am Gloabl now'
[hadoop@localhost ~]$ export my_variable
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ my_variable='NULL'
[hadoop@localhost ~]$ echo $my_variable
NULL
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ 

子shell甚至无法使用export命令改变父shell中全局环境变量的值。
但是会改变孙shell中的值

[hadoop@localhost ~]$ my_variable='I am Gloabl now'
[hadoop@localhost ~]$ export my_variable
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ my_variable='NULL'
[hadoop@localhost ~]$ echo $my_variable
NULL
[hadoop@localhost ~]$ export my_variable
[hadoop@localhost ~]$ echo $my_variable
NULL
[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $my_variable
NULL
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ 

6.3删除环境变量
unset命令,删除已经存在的环境变量。
在unset命令中饮用环境变量时,记住不要使用$。

[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ unset my_variable
[hadoop@localhost ~]$ echo $my_variable

[hadoop@localhost ~]$ 

窍门 在涉及环境变量名时,什么时候该使用 , 什 么 时 候 不 该 使 用 ,什么时候不该使用 使,实在让人摸不着头脑。 记住一点就行了:如果要用到变量,使用 ; 如 果 要 操 作 变 量 , 不 使 用 ;如果要操作变量,不使用 使。这条规则的一个例外就是使用printenv显示某个变量的值。

如果你是在子进程中删除一个全局环境变量,这是对子进程有效(孙进程,曾孙子等)。该全局环境变量在父进程中依然可用

[hadoop@localhost ~]$ my_variable='I am Gloabl now'
[hadoop@localhost ~]$ export my_variable
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ unset my_variable
[hadoop@localhost ~]$ echo $my_variable

[hadoop@localhost ~]$ bash
[hadoop@localhost ~]$ echo $my_variable

[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ exit
exit
[hadoop@localhost ~]$ echo $my_variable
I am Gloabl now
[hadoop@localhost ~]$ 

6.4 默认的shell环境变量
默认情况下,bash shell会用一些特定的环境变量来定义系统环境。
6.5 设置PATH环境变量
当你在shell命令行界面中输入一个外部命令时(参见第5章),shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。在本书所用的Ubuntu系统中, PATH环境变量的内容是这样的:

[hadoop@localhost ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hadoop/bin
[hadoop@localhost ~]$ 

输出中显示了有7个可供shell用来查找命令和程序。
6.6 定位系统环境变量
怎样让环境变量的作用持久化。
shell有3种方式:
 登录时作为默认登录shell
 作为非登录shell的交互式shell
 作为运行脚本的非交互shell
6.6.1 登陆shell
当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里 读取命令:
 /etc/profile
 $HOME/.bash_profile  $HOME/.bashrc
 $HOME/.bash_login
 $HOME/.profile /etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
另外4个启动文件是针对用户的,可根据个人需求定制。我们来仔细看一下各个文件。

CentOS发行版的的/etc/profile文件都用到了同一个特性:for语句。它用来迭代/etc/profile.d目录下的所有文件。这为Linux系统提供了一个放置特定应用程序启
动文件的地方,当用户登录时,shell会执行这些文件。

剩下的启动文件都起着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环
境变量。大多数Linux发行版只用这四个启动文件中的一到两个:
 $HOME/.bash_profile
 $HOME/.bashrc
 $HOME/.bash_login
H O M E / . p r o f i l e 本 节 中 所 列 出 的 HOME/.profile 本节中所列出的 HOME/.profileHOME下的那些文件并
非每个用户都有。例如有些用户可能只有一个$HOME/.bash_profile文件。这很正常。

shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略:
$HOME/.bash_profile 4
$HOME/.bash_login
H O M E / . p r o f i l e 注 意 , 这 个 列 表 中 并 没 有 HOME/.profile 注意,这个列表中并没有 HOME/.profileHOME/.bashrc文件。这是因为该文件通常通过其他文件运行的。
.bash_profile启动文件会先去检查HOME目录中是不是还有一个叫.bashrc的启动文件。如果有
的话,会先执行启动文件里面的命令。

6.7 数组变量
环境变量有一个很酷的特性就是,它们可作为数组使用。数组是能够存储多个值的变量些值可以单独引用,也可以作为整个数组来引用。 要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。

$ mytest=(one two three four five
$ 

没什么特别的地方。如果你想把数组像普通的环境变量那样显示,你会失望的。

$ echo $mytest one 
$ 

只有数组的第一个值显示出来了。要引用一个单独的数组元素,就必须用代表它在数组置的数值索引值。索引值要用方括号括起来。

$ echo ${mytest[2]}
three 
$ 

窍门 环境变量数组的索引值都是从零开始。这通常会带来一些困惑。 122 第 6 章 使用 Linux 环境变
要显示整个数组变量,可用星号作为通配符放在索引值的位置。

$ echo ${mytest[*]} 
one two three four five 
$ 

也可以改变某个索引值位置的值。

$ mytest[2]=seven
$ 
$ echo ${mytest[*]}
one two seven four five 
$ 

甚至能用unset命令删除数组中的某个值,但是要小心,这可能会有点复杂。看下面的例子$ unset mytest[2]

$ 
$ echo ${mytest[*]}
one two four five 
$ 
$ echo ${mytest[2]}
$ echo ${mytest[3]}
four 
$ 

这个例子用unset命令删除在索引值为2的位置上的值。显示整个数组时,看起来像是索引
里面已经没这个索引了。但当专门显示索引值为2的位置上的值时,就能看到这个位置是空的。
最后,可以在unset命令后跟上数组名来删除整个数组。

$ unset mytest
$ 
$ echo ${mytest[*]}
$ 

有时数组变量会让事情很麻烦,所以在shell脚本编程时并不常用。对其他shell而言,数组变
量的可移植性并不好,如果需要在不同的shell环境下从事大量的脚本编写工作,这会带来很多不
便。有些bash系统环境变量使用了数组(比如BASH_VERSINFO),但总体上不会太频繁用到。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值