一、什么是环境变量

1.1 概念理解

环境变量(Environment Variable) 是在操作系统或程序外部设置的变量,以 变量名=值 的形式存在。简单来说,环境变量就是系统用来存储一些“全局信息”的容器,任何程序都可以根据需要去读取这些信息。

打个比方:环境变量就像学校里的一块公告板,上面写着“今天食堂菜单”“下午3点开会”等信息。任何人(程序)路过都能看到,而且可以随时更新上面的内容。

1.2 环境变量的特征

 由名称/值对组成,如 HOME=/home/zhang
 可以在任何时间点进行创建、修改和删除
 用于存储 shell 会话和工作环境的信息
 允许程序或脚本快速访问这些数据
 是一种持久存储数据的简便方法

1.3 默认的 Shell 环境变量

Bash Shell 继承自 Unix Bourne Shell,因此保留了许多经典的 Bourne 环境变量。同时,Bash 也提供了自己特有的变量。

系统环境变量通常使用全大写字母,以区别于普通用户的环境变量。例如:

变量名 含义
HOME 当前用户的主目录
PSTH 命令搜索路径
SHELL

当前使用的Shell类型

USER

当前用户名

PWD 

当前工作目录

OLDPWD 上一个工作目录

二、全局变量和局部变量

在 Bash Shell 中,环境变量分为两大类:

2.1 全局环境变量

全局环境变量对当前 Shell 会话和所有由它生成的子 Shell 都是可见的。

bash
# 查看所有全局变量
env
printenv

# 查看单个全局变量(两种方式)
echo $HOME
printenv HOME
 

2.2 局部环境变量

局部环境变量只在定义它们的那个 Shell 进程中可见,子 Shell 无法访问。

Linux 系统没有专门只显示局部变量的命令。但可以使用 set 命令显示为某个特定进程设置的所有环境变量(包括局部、全局和用户自定义变量)。

bash
# 查看当前 shell 的所有变量
set
 

2.3 父子 Shell 中的变量传递实验

练习1:验证全局变量与局部变量的区别

bash
# 1. 在父 Shell 中创建局部变量
local_var="我是局部的"
echo $local_var    # 输出:我是局部的

# 2. 进入子 Shell
bash
2echo $local_var    # 输出为空(子 Shell 看不到局部变量)
exit               # 退出子 Shell

# 3. 创建全局变量
export global_var="我是全局的"
echo $global_var   # 输出:我是全局的

# 4. 再次进入子 Shell
bash
echo $global_var   # 输出:我是全局的(子 Shell 能看到)
exit

关键结论:

 局部变量 → 子 Shell 看不到
 全局变量 → 子 Shell 能看到
 在子 Shell 中修改全局变量,不影响父 Shell 中的值

三、用户如何创建、删除环境变量

3.1 创建局部变量

bash
# 语法:变量名=值(等号两边不能有空格!)
my_name="Zhang Jinyuan"
my_age=20
my_path=/home/zhang/test

# 查看变量
echo $my_name      # 输出:Zhang Jinyuan

# 注意事项:
# ✅ 正确:var="Hello World"
# ❌ 错误:var = "Hello World"(等号两边有空格)
# ❌ 错误:var=Hello World(值有空格但未加引号)
 

变量命名规范:

 系统环境变量:大写(如 PATH、HOME)
 用户自定义变量和脚本变量:小写(避免与系统变量冲突)

3.2 创建全局变量(导出)

bash
# 先创建局部变量
my_global="我可以导出"

# 使用 export 导出为全局变量
export my_global

# 一步到位写法
export my_global="我可以导出"
 

3.3 删除环境变量

bash
# 使用 unset 命令(注意:不要加 $)
unset my_name
unset my_global

# 验证是否删除
echo $my_name      # 输出为空
 

记忆技巧:

 要用到变量的值 → 使用 $,如 echo $HOME
 要操作变量本身 → 不使用 $,如 unset HOME
 特殊情况:printenv HOME(例外,不加 $)

3.4 让变量永久生效

用户自定义的变量,在重启 Shell 后就会消失。要想永久保存,需要写入启动文件。

bash
# 编辑用户启动文件
vim ~/.bashrc

# 在文件末尾添加
export my_permanent="我永远不会丢"

# 保存后使配置立即生效
source ~/.bashrc

# 验证
echo $my_permanent
 

练习2:全局变量完整操作流程

bash
# 1. 父 Shell 中创建并导出
export test_var="原始值"

# 2. 进入子 Shell
bash

# 3. 子 Shell 中查看
echo $test_var     # 输出:原始值

# 4. 子 Shell 中修改并重新导出
test_var="新值"
export test_var
echo $test_var     # 输出:新值

# 5. 退出子 Shell
exit

# 6. 父 Shell 中查看(仍然是原始值)
echo $test_var     # 输出:原始值
 

四、PATH 环境变量(重点)

4.1 什么是 PATH

当你在命令行输入一个命令(如 ls、bash、python)时,Shell 需要知道这个程序在哪个目录下。PATH 环境变量就定义了 Shell 搜索命令的目录列表。

bash
# 查看当前 PATH
echo $PATH
# 输出示例:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
 

PATH 中的目录用冒号(:) 分隔。

4.2 为什么有些命令可以直接输入,有些不行?

bash
# 像 bash、ls 这些命令,因为它们的所在目录(如 /bin)已经在 PATH 中
bash        # 直接执行,没问题
ls          # 直接执行,没问题

# 如果你在 /opt/myapp/bin 目录下有个程序叫 myapp
# 直接输入 myapp 会提示 "command not found"
myapp       # ❌ 找不到

4.3 如何添加自定义目录到 PATH

方法一:临时添加(当前会话有效)

bash
export PATH=$PATH:/opt/myapp/bin
 

方法二:永久添加(重启不丢失)

bash
vim ~/.bashrc
# 在末尾添加
export PATH=$PATH:/opt/myapp/bin

# 使配置生效
source ~/.bashrc

4.4 PATH 操作注意事项

bash
# ✅ 正确:追加新路径
export PATH=$PATH:/新目录

# ✅ 正确:在前面添加路径(优先级更高)
export PATH=/新目录:$PATH

# ❌ 危险:不要这样写(会覆盖所有系统命令,导致系统瘫痪)
export PATH=/新目录
 

五、存放系统环境变量的文件

5.1 登录 Shell 的启动文件

当你登录 Linux 系统时,Bash Shell 会作为登录 Shell 启动,并按顺序读取以下启动文件:

文件路径 说明
/etc/profile 系统级主启动文件,所有用户登录时执行
/etc/profile.d/*.sh

系统级扩展配置目录

$HOME/.profile

用户个人配置
$HOME/.bashrc 用户最常用的个人配置

$HOME/.bash_login

用户登录配置(较少使用)
$HOME/.bash_profile 用户登录配置(优先级最高)

5.2 各文件的作用

/etc/profile:

 系统默认的主启动文件
 会遍历执行 /etc/profile.d/ 目录下的所有 .sh 脚本
 修改需要 root 权限

~/.bashrc(最常用):

 每次启动新 Shell 时都会执行
 用于设置用户的别名、函数、环境变量等
 是用户自定义配置的首选文件

~/.profile / ~/.bash_profile:

 仅在登录 Shell 时执行
 一般用来设置 PATH 等环境变量

5.3 实践:自定义永久环境变量

bash
# 方法:修改 ~/.bashrc(推荐)
echo 'export MY_CUSTOM_PATH="/home/zhang/mybin"' >> ~/.bashrc
source ~/.bashrc
echo $MY_CUSTOM_PATH
 

六、数组变量

6.1 什么是数组变量

Bash Shell 只支持一维数组。数组可以存储多个值,用空格分隔,并用括号 () 括起来。

bash
# 定义数组
team_members=(张三 李四 王五 赵六)

# 访问数组元素(索引从 0 开始)
echo ${team_members[0]}    # 输出:张三
echo ${team_members[2]}    # 输出:王五

# 显示整个数组
echo ${team_members[*]}    # 输出:张三 李四 王五 赵六
 

6.2 数组的常用操作

bash
# 定义数组
students=(小明 小红 小刚 小丽)

# 1. 修改某个元素
students[1]="小美"
echo ${students[*]}        # 输出:小明 小美 小刚 小丽

# 2. 删除某个元素(保留索引位置,值为空)
unset students[2]
echo ${students[*]}        # 输出:小明 小美 小丽
echo ${students[2]}        # 输出为空

# 3. 删除整个数组
unset students
echo ${students[*]}        # 输出为空
 

6.3 练习3:数组完整操作

bash
# 1. 建立多组员名称数组
team=(张晋源 李小明 王大力 赵小华)

# 2. 查看数组
echo ${team[*]}

# 3. 更改一位成员
team[1]="李新宇"

# 4. 删除一位成员
unset team[3]

# 5. 删除整个数组
unset team
 

七、总结

7.1 知识框架图


Linux 环境变量

├── 什么是环境变量
│   ├── 名称/值对 (VAR=value)
│   └── 存储系统和工作环境信息

├── 变量分类
│   ├── 全局变量(env / printenv 查看)
│   └── 局部变量(set 查看)

├── 变量操作
│   ├── 创建:VAR=value(局部)/ export(全局)
│   ├── 删除:unset VAR
│   └── 永久化:写入 ~/.bashrc

├── PATH 变量
│   ├── 定义命令搜索目录
│   ├── 用 : 分隔多个目录
│   └── 追加:export PATH=$PATH:/新目录

├── 启动文件
│   ├── /etc/profile(系统级)
│   └── ~/.bashrc(用户级,最常用)

└── 数组变量
    ├── 定义:(值1 值2 值3)
    ├── 访问:${数组[索引]}
    └── 操作:修改、删除、清空
 

7.2 核心命令速查表

操作 命令
查看所有全局变量 env或printenv
查看所有变量 set
查看单个变量值 echo $VAR或printenv VAR
创建局部变量 VAR=value
创建全局变量 export VAR=value
删除变量 unset VAR
追加PATH export PATH=$PATH:/新路径
永久保存变量 写入~/.bashrc,执行source~/.bashrc

7.3 注意事项汇总

1. 变量赋值时,等号两边不能有空格
2. 引用变量要加 $,操作变量不加 $
3. 系统变量用大写,自定义变量用小写
4. 修改 PATH 时要追加($PATH:),不要覆盖
5. 修改 ~/.bashrc 后记得 source 使生效

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐