什么是环境变量

1. 基础概念

环境变量是操作系统存储环境信息的键值对(格式:变量名=值),作用是给Shell、程序、脚本共享数据,相当于系统自带的“全局备忘录”。

系统自带环境变量统一全大写,用来区分用户自定义变量;

我们自己写的变量建议用小写,避免覆盖系统自带变量引发故障。

2. 两类Shell变量(核心区分)

bash里变量分为全局环境变量、局部变量,最大区别是作用范围:
1. 全局环境变量
当前Shell、以及当前Shell创建的所有子Shell都能读取,父子进程之间可以传递。
2. 局部变量
仅能在创建它的那个Shell里使用,子Shell完全看不到。

3. 查看变量的3个基础命令

1. env / printenv:只查看全局环境变量,系统自带变量都在这里;

2. echo $变量名:单独查看某一个变量的值,引用变量必须加$;

3. set:查看当前Shell全部变量,包含全局+局部自定义变量,会按字母排序输出。

示例:查看当前用户家目录
printenv HOME
echo $HOME
自定义变量:局部变量 & 全局变量

1. 局部变量(仅当前Shell可用)

定义规则

• 变量名、等号、值中间不能有空格;

• 字符串带空格时,用单引号包裹内容;

• 仅当前终端窗口生效,新开/重启终端直接消失。
# 正确写法
name=xiaoming
sentence='I am a linux beginner'
# 错误写法(等号两边空格会报错)
name = xiaoming
关键特性

• 在父Shell定义局部变量,进入子Shell后无法读取;

• 在子Shell定义局部变量,退出子Shell回到父Shell,变量直接消失;
原理:父子Shell是独立进程,内存空间隔离,局部变量不会跨进程传递。

2. 全局环境变量(父子Shell通用)

用export把局部变量升级为全局环境变量,子进程可以继承:
# 1. 先定义局部变量
book=linux_note
# 2. 导出为全局变量
export book
重要特性(新手高频踩坑点)

1. 子Shell会复制一份父进程全局变量,副本独立;

2. 子Shell内修改、重新export变量,只会改变自己这份副本,不会影响父Shell原始变量;

3. 退出子Shell后,子进程所有修改全部作废,父变量保持原样。

删除变量:unset命令

操作变量(删除)时**不加**;读取变量值时才加。
# 删除变量,无$
unset book
# 读取变量,加$
echo $book
两种场景效果

1. 在子Shell执行unset:仅删除子进程内的变量副本,父Shell变量完好无损;

2. 在父Shell执行unset:彻底删除全局变量,当前会话永久失效。

系统自带默认环境变量

bash内置大量自带全局变量,保存系统、用户、终端信息,几个最常用的:
变量名 作用说明 
HOME 当前用户的家目录 
PWD 当前所在工作目录 
UID 当前用户数字ID 
SHELL 当前使用的解释器(一般/bin/bash) 
LINES 终端可见行数 
HOSTNAME 主机名称 

PATH环境变量

1. PATH是什么

PATH是系统用来查找命令/脚本文件的目录列表,多个目录用冒号:分隔。
输入ls、cd、自定义脚本时,Shell会按PATH里的目录顺序挨个搜索可执行文件,找不到就提示command not found。

2. 临时修改PATH(仅当前终端有效)

把自定义脚本目录追加到PATH,不用每次输入./脚本名运行文件:
# 保留原有PATH,新增当前目录
export PATH=$PATH:.
3. 临时修改的局限

仅本次打开的终端窗口生效,关闭终端、重启系统后,PATH会恢复系统默认配置,新增目录直接失效。

4. 脚本运行问题解释

1. 只输入脚本文件名(如test.sh):PATH没有当前目录,找不到文件,报错;

2. ./test.sh可以运行:./手动指定当前目录,直接定位文件;

3. 追加当前目录到PATH后:直接输入文件名就能运行;

4. 重启系统后失效:临时环境变量不会持久保存。

补充:脚本运行前必须赋予执行权限 chmod u+x xxx.sh,否则路径正确也无法执行。

环境变量持久化:Shell启动配置文件

临时变量重启就消失,如果想要永久生效,需要写入Shell启动文件。登录系统打开bash时,会自动读取这些文件加载变量配置。

1. 系统级配置(所有用户生效)

/etc/profile:系统全局启动文件,每一个用户登录都会执行,存放全用户通用环境变量。
系统还会读取/etc/profile.d/目录下所有sh脚本,统一加载系统配置。

2. 用户专属配置(仅当前用户生效)

存放于用户家目录$HOME下,Shell按固定顺序读取,找到第一个文件就停止读取剩余文件:

1. ~/.bash_profile(优先读取)

2. ~/.bash_login

3. ~/.profile
以上文件内部一般会自动加载~/.bashrc,存放个人自定义环境变量、别名、PATH配置。

3. 修改后立即生效

修改配置文件不会自动刷新终端,执行下面命令立刻加载配置,不用重启电脑:
source ~/.bashrc
# 系统全局文件用
source /etc/profile
Shell数组变量

环境变量支持数组,一个变量存储多组数据,索引从0开始。

1. 数组定义与读取
# 定义数组
arr=("小明" "小红" "小刚")
# 读取单个元素
echo ${arr[0]}
# 读取全部元素
echo ${arr[*]}
2. 修改、删除数组
# 修改指定索引内容
arr[2]="小李"
# 删除单个元素
unset arr[1]
# 删除整个数组
unset arr
核心总结
1. 变量分全局、局部,export将局部转为全局,子进程只能继承、不能反向修改父变量;

2. unset删除变量不加,读取变量必须带;

3. PATH控制命令搜索路径,临时修改仅当前会话有效,永久配置写入bash启动文件;

4. 父子进程内存隔离,子Shell所有变量修改、删除操作,不会影响父Shell;

5. 系统大写环境变量,自定义变量建议小写,避免冲突;

6. 数组变量可存储多个值,支持单元素修改、删除、整体销毁。

Logo

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

更多推荐