环境变量(Liunx&Shell)
什么是环境变量
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. 数组变量可存储多个值,支持单元素修改、删除、整体销毁。




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

所有评论(0)