第六章 使用Linux环境变量
1.什么是环境变量
bash shell用一个叫做环境变量(environment)
的特性来存储有关shell会话和工作环境的信息。环境变量
允许你在内存那种存储数据,以便程序或shell中运行的脚本能够轻松访问他们。bash shell中环境变量分为两类:全局变量,局部变量。
全局环境变量:对于shell会话和所有生成的子shell都是可见的。
局部环境变量:只对创建他们的shell可见。
Linux系统在开始bash时就设置了一些全局环境变量,系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。查看全局环境变量,可以使用env
或printenv
命令。
$ printenv
HOSTNAME=server01.class.edu
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
要显示个别环境变量的值,可以使用printenv
命令,但是不要使用env
命令。
$ printenv HOME
/home/Christine
$
$ env HOME
env: HOME: No such file or directory
也可以使用echo
命令显示变量的值。在此情况下引用某个环境变量的值,必须在变量前面加上一个美元符号($
)。
$ echo $HOME
/home/Christine
在echo
命令中,在变量名前面加上$
可不仅仅是要显示变量当前的值,也能够让变量作为命令行参数。
$ ls $HOME
Desktop Downloads Music Public test.sh
Documents junk.dat Pictures Templates Videos
$
$ ls /home/Christine
Desktop Downloads Music Public test.sh
Documents junk.dat Pictures Templates Videos
局部环境变量:局部环境变量就是只能在创建他们的进程中可见。Linux系统也默认定义了标准的局部环境变量。set
命令会显示为某个特定进程设置的所有环境变量,包括局部变量,全局变量以及用户自定义变量。
2.设置用户自定义变量
启动了bash shell就可以在shell进程内创建局部变量,可以通过=
等号给环境变量赋值,值可以是数值或字符串。
$ echo $my_variable
$ my_variable=Hello
$
$ echo $my_variable
Hello
如果要给变量赋一个含有空格的字符串值,必须使用但引号来界定字符串的首和尾。
$ my_variable=Hello World
-bash: World: command not found
$
$ my_variable="Hello World"
$
$ echo $my_variable
Hello World
没有单引号的话,bash shell会以为下一个单词是另一个要执行的命令。用户定义的环境变量都是小写字幕,系统环境变量都是大写字母。
变量名,等号和值之间没有空格。
$ my_variable = "Hello World"
-bash: my_variable: command not found
设置全局环境变量的方法是先创建一个局部环境部变量,然后再把它导入到全局环境中,使用export
命令,变量名前不需要加$
。
$ my_variable="I am Global now"
$
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ exit
exit
$
$ echo $my_variabl
修改子shell中全局环境变量并不会影响到父shell中该变量的值。子shell甚至无法使用export
命令改变父shell中全局环境变量的值。
$ my_variable="I am Global now"
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ my_variable="Null"
$
$ echo $my_variable
Null
$
$ exit
exit
$
$ echo $my_variable
I am Global now
3.删除环境变量
使用unset
命令删除环境变量。在使用unset
命令中引用环境变量时,不要使用$
符号。
$ echo $my_variable
I am Global now
$
$ unset my_variable
$
$ echo $my_variable
$
如果用到环境变量,要使用$
;如果要操作环境变量,不要使用$
。此规则唯一一个例外就是使用printenv
命令显示某个变量的值。
如果在子进程中删除了一个全局变量,只对子进程有效。该全局环境变量在父进程中依然可用。和修改变量一样,在子shell中删除全局变量后,无法将结果反映到父shell中。
4.默认的shell环境变量
bash shell源自当初的Unix Bourne shell,因此也保留了Unix Bourne shell里定义的那些环境变量。如下列出几个常用的默认bash shell环境变量:
HOME
:当前用户的主目录。
PATH
:shell查找命令的目录列表,由冒号分隔。
BASH
:当前shell事例的全路径名。
5.设置PATH环境变量
**当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。**PATH环境变量定义了用于进行命令和程序查找的目录。PATH环境变量的内容如下:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games:/usr/local/games
PATH中的目录使用:
分隔。**如果命令或程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的。**应用程序放置可执行文件的目录常常不在PATH环境变量所包含的目录中,解决办法是保证PATH环境变量包含了所有存放应用程序的目录。可以把新的搜索目录添加到现有的PATH环境变量中,无需从头定义,只需引用原来的PATH值,然后再给这个字符串添加到新目录就可以了。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games:/usr/local/games
$
$ PATH=$PATH:/home/christine/Scripts
$
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/
games:/usr/local/games:/home/christine/Scripts
将目录加到PATH环境变量后,就可以在虚拟目录结构中的任何位置执行程序。将单点字符也加入到PATH环境变量,单点字符.
表示当前目录。对PATH变量的修改只能持续到退出或重启系统。
6.定位系统环境变量
当你登录Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫做启动文件
或环境文件
。bash检查的启动文件取决于你启动bash shell的方式,bash shell有三种方式:登录时作为默认登录shell,作为非登录shell的交互shell,作为运行脚本的非交互shell。
登录shell:当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:/etc/profile
,$HOME/.bash_profile
,$HOME/.bashrc
,$HOME/.bash_login
,$HOME/.profile
。
/etc/profile
文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。
$HOME
目录下的启动文件:提供一个用户专属的启动文件来定义该用户所用到的环境变量。大多数Linux发行版只用到四个启动文件中的一个到两个。$HOME
表示的是某个用户的主目录,他和波浪号~
的作用一样。
交互式shell进程:如果bash shell不是在登录时系统启动的话,那么此bash shell叫做交互式shell
。交互式shell不会向登录shell一样运行,但是它依然提供了命令行提示符来输入命令。如果bash是作为交互式shell启动的,他不会访问/etc/profile
文件,只会检查用户HOME目录中的.bashrc
文件。
非交互式shell:系统执行shell脚本用的就是这种shell,不同的地方在于它没有命令行提示符。但当你在系统上运行脚本时,也许希望运行一些特定启动的命令。为了处理这种情况,bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,他会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令。通常包括shell脚本变量设置。
环境变量持久化
对于全局环境变量来说,可能更倾向于将新的或修改过的变量设置放在/etc/profile
变量中,但是此种做法有风险,如果升级了所用的发行版,这个文件会更新,那么所设定的变量就可能没有了。最好是在/etc/profile.d
目录中创建一个以.sh
结尾的文件,把所有新的或修改过的全局环境变量设置放在这个文件中。**在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc
文件。**这一点适用于所有类型的shell进程。
7.数组变量
环境变量有一个特性是可以作为数组
使用,数组是能够存储多个值的变量,这些值可以单独引用,也可以作为这个数组来引用。要给某个环境变量设置多个值,可以把值放在括号里,值与值之间使用空格分隔。
$ mytest=(one two three four five)
$
要引用一个单独的数组元素,就必须用代表它在数组中位置的数值索引值,索引值要用方括号括起来。
$ echo ${mytest[2]}
three
要显示整个数组变量,可以用星号作为通配符放在索引值的位置。
$ echo ${mytest[*]}
one two three four five
$
也可以改变某个索引值位置的值。
$ mytest[2]=seven
$
$ echo ${mytest[*]}
one two seven four five
可以使用unset
命令删除这个数组。
$ unset mytest
$
$ echo ${mytest[*]}
$
有时候数组很麻烦,所以在shell脚本编程中并不常用。
本章小结
1.全局/局部环境变量。
2.设置,删除环境变量。
参考文献:Linux命令行与shell脚本编程大全(第三版)Richard Blum Christine Bresnahan著 门佳 武海峰译