> For the complete documentation index, see [llms.txt](https://linux-in-action.gitbook.io/project/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://linux-in-action.gitbook.io/project/ji-ben-cao-zuo/set.md).

# 环境变量 env/export/set/unset

## 环境变量

*环境变量* 是 shell 用来存储有关 shell 会话和工作环境的信息（这也是它们被称作环境变量的原因），比如系统的名称、登录到系统上的用户名、用户的系统 ID （也称为 UID ）、用户的默认主目录以及 shell 查找程序的搜索路径。这项特性允许你在内存中存储数据，以便程序或 shell 中运行的脚本能够轻松访问到它们。

在 bash shell 中，环境变量分为两类：

* 全局变量
* 局部变量&#x20;

## env 命令

`env` 命令用于显示系统中已存在的环境变量，以及在定义的环境中执行指令。

### 命令用法

```
$ env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
```

其中：

* `[NAME=VALUE]`：变量定义 —— 定义在新的环境中变量，定义多个变量定义用空格隔开。
* `[COMMAND [ARG]...]`：指定要执行的命令和参数。

### 常用可选参数

| 参数                       | 说明                   |
| ------------------------ | -------------------- |
| -i, --ignore-environment | 新开始一个空的环境变量列表        |
| -u, --unset=NAME         | 从当前环境变量环境移除 `NAME` 键 |

## export 命令

`export` 命令用于将 shell 变量输出为环境变量，或者将 shell 函数输出为环境变量。

### 命令用法

```bash
$ export [-fn] [name[=value] ...]
$ export -p
```

其中：

* `[name[=value] ...]` 指定要输出或删除的环境变量

### 常用可选参数

| 参数 | 说明                                |
| -- | --------------------------------- |
| -f | 以函数名称作为变量名称                       |
| -n | 删除指定的变量。实际上并未删除，只是不会输出到后续指令的执行环境中 |
| -p | 列出所有经过 `export` 得到的变量以及函数         |

## set 命令

`set` 命令作用主要是显示系统中已经存在的shell变量，以及设置 shell 变量的新变量值。

使用 `set` 更改 shell 特性时，符号 "+" 和 "-" 的作用分别是打开和关闭指定的模式。

> &#x20;`set` 命令不能够定义新的 shell 变量。如果要定义新的变量，可以使用 `declare` 命令以 `变量名=值` 的格式进行定义即可。

### 命令用法

```
$ set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
```

### 常用可选参数

| 参数 | 说明                           |
| -- | ---------------------------- |
| -a | 标记那些被修改过的或是通过 `export` 得到的变量 |
| -b | (修改变量时)马上通知作业终止              |
| -e | 如果一个命令的退出状态不为 0，马上退出         |
| -f | 取消使用通配符                      |
| -h | 自动记录函数的所在位置                  |
| -k | 命令所给的参数都会被视为此命令的环境变量         |
| -m | 启动作业监视模式                     |
| -n | 读取命令但不实际执行                   |
| -t | 执行完随后的指令，即退出 shell           |
| -u | 当执行时使用到未定义过的变量，则显示错误信息       |
| -v | 显示 shell 所读取的输入值             |
| -x | 执行指令后，会先显示该指令及所下的参数          |

### 使用实例

```bash
# 先声明一个新的环境变量
$ declare myvariable = "CSharp"
# 使用 set 将新定义的变量输出为环境变量
$ set -a myvariable
# 查看新添加的环境变量
$ env | grep myvariable
```

## unset 命令

`unset` 命令用于删除已定义的 shell 变量（包括环境变量）和 shell 函数。

> &#x20;在 `unset` 命令中引用环境变量时，记住不要使用 `$`

### 命令用法

```
$ unset [-f] [-v] [-n] [name ...]
```

注意， 1. 如果不指定 `-f` 或 `-v`，默认是会当成先处理 shell 变量，如果失败就会处理 shell 函数。 2. `unset` 命令不能够删除具有只读属性的 shell 变量和环境变量。

### 常用可选参数

| 参数 | 说明    |
| -- | ----- |
| -f | 仅删除函数 |
| -v | 仅删除变量 |

### 使用实例

```bash
# 删除指定的环境变量
gackle@machine:~$ unset -v mylove
```

## 使用 `$` 的时机

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