Linux环境变量完整学习实操笔记
一、认识环境变量
环境变量是以变量名=值形式存储数据的键值对,Shell依靠环境变量保存会话、系统运行相关信息,程序、脚本可以快速读取内存中存储的数据。系统自带大量默认环境变量,用来定义终端运行环境,常见自带变量有HOME、PATH、PWD、PS1、UID等。
系统环境变量统一使用大写命名,方便和用户自定义变量区分。bash中环境变量分为两大类:全局环境变量、局部环境变量,二者生效范围存在明显区别。
二、全局变量与局部变量区分实操
2.1 全局环境变量
全局变量对当前Shell以及所有子Shell进程都可见。
查看全局变量命令
env、printenv两条命令均可输出全部全局环境变量;单独查看某一个变量可以使用printenv 变量名、env | grep 变量名;使用echo $变量名也能打印变量值,引用变量时必须添加美元符号$。全局变量可被子Shell继承
执行bash生成子Shell,子Shell内依旧可以读取HOME、PWD等系统全局变量,父子进程共用同一套全局环境数据。
2.2 局部环境变量
局部变量仅能在创建它的当前Shell进程内使用,子Shell无法读取。没有单独只查看局部变量的命令,set命令可以输出当前进程所有变量,包含局部、全局、自定义变量,并按字母排序。
2.3 自定义局部变量实操
自定义局部变量语法规则:
- 变量名、等号、数值之间不能有空格;
- 字符串包含空格时,使用英文单引号包裹完整内容;
- 自定义变量建议小写,避免覆盖系统大写环境变量。
实操流程:
- 错误示范:
my variable=Hello,变量名带空格,系统识别my为命令直接报错; - 正确定义:
my_variable=Hello,当前终端echo可正常输出; - 输入bash进入子Shell,执行
echo $my_variable无输出,证明局部变量无法传递给子进程; - exit退出子Shell回到父终端,再次echo变量可以正常打印。
2.4 自定义全局变量实操
局部变量通过export命令导出后,升级为全局变量,所有子Shell均可读取。
实操流程:
- 定义局部变量
my_variable='Global variable'; export my_variable导出为全局;- bash进入子Shell,echo能够正常读取变量;
- 子Shell内重新给变量赋值,仅修改子进程内部数据,exit回到父Shell,变量依旧是原始值,子进程修改不会影响父进程。
2.5 删除自定义变量unset
删除变量命令为unset 变量名,操作变量时不能加$符号,若写unset $my_variable会直接读取变量值执行删除,操作无效。
子Shell内unset变量仅作用于子进程,退出后父Shell变量依旧存在。
2.6 永久保存自定义全局变量
临时export的变量关闭终端就会消失,想要永久生效,写入用户专属启动文件~/.bashrc:
vim ~/.bashrc打开配置文件;- 文件末尾添加
export my_variable='Hello World'; - 保存退出,执行
source ~/.bashrc刷新配置,无需重启终端; - 新开终端、创建多层子Shell,变量均可通过env查询到。
三、PATH环境变量详解
PATH是系统核心全局环境变量,存储一系列目录路径,多个目录使用英文冒号分隔。我们输入外部命令时,Shell会按PATH内目录顺序依次检索,找到对应可执行程序运行。
- 查看PATH:
echo $PATH或env检索PATH字段;
- 临时追加自定义目录:
export PATH=$PATH:/自定义文件夹路径,仅当前终端生效; - 永久添加自定义目录:编辑
~/.bashrc写入PATH追加语句,source刷新配置后永久生效。
四、Shell启动配置文件
登录Linux后bash会自动读取多份启动文件加载环境配置,分为系统级文件与用户专属文件:
- 系统全局文件:
/etc/profile,所有用户登录都会加载,定义系统公共环境; - 用户私有隐藏文件:
~/.bashrc、~/.profile、~/.bash_login、~/.bash_profile;
日常实操主要使用~/.bashrc,每次开启新终端、子Shell都会自动加载文件内的变量、别名配置。
注意:文件内if判断语法必须if与fi成对,缺失fi会出现语法报错,终端启动异常,补全fi后执行source即可修复。
五、Shell数组变量
数组可以一次性存储多个数据,bash仅支持一维数组,括号()定义数组,元素空格分隔,下标从0开始。
- 定义数组:
my_test=(one two three); - 读取单个元素:
${my_test[下标]}; - 读取全部数组内容:
${my_test[*]}; - 修改指定下标数据:
my_test[1]=five; - 删除单个元素:
unset my_test[1];删除整个数组:unset my_test。
数组默认属于局部变量,无法完整导出为全局变量,env命令查询不到数组信息。
六、完整知识总结
- 变量分类:全局变量env可查看,子Shell共享;局部变量仅当前终端有效,子进程无法读取,set可查看全部变量;
- 自定义变量:赋值等号两侧不能空格,含空格字符串用英文单引号包裹;export导出局部变量为全局;
- unset删除变量不加$,临时变量重启终端失效,写入~/.bashrc实现永久环境配置;
- PATH控制命令检索目录,可临时、永久追加自定义程序文件夹;
- ~/.bashrc为用户终端启动文件,统一配置全局变量、别名,脚本if语句必须搭配fi;
- Shell一维数组存储多组数据,支持下标取值、修改、删除,数组不属于全局环境变量。
