2024-04-01

# 三. 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[*]}$

```

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容