# 三. Linux环境变量
首先,环境变量是由shell维护的一组变量,用于定义系统属性。环境变量分为两种类型:全局变量和局部变量。
## 全局变量
- - -
全局变量会被任何由该shell生成的子shell或进程继承,系统环境变量基本会使用全大写字母。
要查看全局变量,可以使用`env`或`printenv`命令。这些命令将显示当前系统中所有全局变量的列表。
### 设置全局环境变量
- - -
创建全局环境变量的方法是先创建局部变量,然后再将其通过export导出到全局环境中。修改子shell中的全局环境变量并不会影响父shell中该变量的值。子shell甚至无法使用export命令改变父shell中全局环境变量的值。
```bash
$ export my_variable="I am Global now"$ echo $my_variableI am Global now$$ bash$ echo $my_variableI am Global now$ my_variable="Null"$ echo $my_variableNull$ exitexit$$ echo $my_variableI am Global now$
```
## 局部变量
- - -
局部则仅在定义它们的shell中有效。没有命令只显示局部变量,set命令可以显示特定进程的所有环境变量,既包括局部变量、全局变量,也包括用户自定义变量。
### 设置用户自定义局部变量
- - -
设置用户自定义局部变量,只需使用等号为变量赋值,值可以是数值或字符串。如果用于赋值的字符串包含空格,则必须用单引号或双引号来界定该字符串的起止。在变量名、等号和值之间没有空格。
```bash
$ my_variable=Hello$ echo $my_variableHello$
```
## 删除环境变量
- - -
可以使用`unset`命令删除环境变量。如果是在子进程中删除了一个全局环境变量,那么该操作仅对子进程有效,该全局环境变量在父进程中依然可用。
```bash
$ export my_variable="I am Global now"$ echo $my_variableI am Global now$$ bash$ echo $my_variableI am Global now$ unset my_variable$ echo $my_variable$ exitexit$ echo $my_variableI am Global now$
```
## PATH环境变量
- - -
PATH环境变量定义了用于查找命令和程序的目录。如果命令或者程序所在的位置没有包括在PATH变量中,那么在不使用绝对路径的情况下,shell是无法找到的。
你可以把新的搜索目录添加到现有的PATH环境变量中,无须从头定义。
```bash
$ ls /home/christine/Scripts/myprog$ echo $PATH/home/christine/.local/bin:/home/christine/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin$$ export PATH=$PATH:/home/christine/Scripts$
```
## 系统环境变量
- - -
登录Linux系统启动bash shell时,默认情况下bash会在几个文件中查找命令。这些文件称作启动文件或环境文件。
bash进程的启动文件取决于你启动bash shell的方式。启动bash shell有以下3种方式:
* 登录时作为默认登录shell
* 作为交互式shell,通过生成子shell启动
* 作为运行脚本的非交互式shell
### 登陆shell
- - -
登录shell通常会从5个不同的启动文件中读取命令。
* /etc/profile
* $HOME/.bash_profile
* $HOME/.bash_login
* $HOME/.profile
* $HOME/.bashrc
/etc/profile文件是系统中默认的bash shell的主启动文件,系统中的每个用户登录时都会执行这个启动文件。
其余的4个文件是针对用户的,shell会按照下列顺序执行第一个被找到的文件,余下的则被忽略。
* $HOME/.bash_profile
* $HOME/.bash_login
* $HOME/.profile
你会发现这个列表中并没有$HOME/.bashrc文件。这是因为该文件通常通过其他文件运行。
### 交互式shell进程
- - -
如果不是在登录系统时启动的bash shell(比如在命令行中输入bash),那么这时的shell称作交互式shell。作为交互式shell启动的bash并不处理/etc/profile文件,只检查用户$HOME目录中的.bashrc文件。
### 非交互式shell
- - -
系统执行shell脚本时用的就是这种shell。不同之处在于它没有命令行提示符。但是,当你在系统中运行脚本时,也许希望能够运行一些特定的启动命令。
为了处理这种情况,bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,会检查这个环境变量以查看要执行的启动文件名。如果有指定的文件,则shell会执行该文件里的命令,这通常包括shell脚本变量设置。
## 环境变量持久化
- - -
对于需要持久化的环境变量,将其写到shell的启动文件中。
## 数组变量
- - -
数组是能够存储多个值的变量。这些值既可以单独引用,也可以作为整体引用。要为某个环境变量设置多个值,可以把值放在圆括号中,值与值之间以空格分隔:
```bash
$ mytest=(zero one two three four)$
$ echo $mytestzero$
$ echo ${mytest[2]}two$
$ echo ${mytest[*]}zero one two three four$
$ mytest[2]=seven$ echo ${mytest[2]}seven$
$ unset mytest[2]$ echo ${mytest[*]}zero one three four$$ echo ${mytest[2]}$ echo ${mytest[3]}three$
$ unset mytest$ echo ${mytest[*]}$
```