环境变量(LiunxShell)
什么是环境变量1. 基础概念环境变量是操作系统存储环境信息的键值对格式变量名值作用是给Shell、程序、脚本共享数据相当于系统自带的“全局备忘录”。系统自带环境变量统一全大写用来区分用户自定义变量我们自己写的变量建议用小写避免覆盖系统自带变量引发故障。2. 两类Shell变量核心区分bash里变量分为全局环境变量、局部变量最大区别是作用范围1. 全局环境变量当前Shell、以及当前Shell创建的所有子Shell都能读取父子进程之间可以传递。2. 局部变量仅能在创建它的那个Shell里使用子Shell完全看不到。3. 查看变量的3个基础命令1. env / printenv只查看全局环境变量系统自带变量都在这里2. echo $变量名单独查看某一个变量的值引用变量必须加$3. set查看当前Shell全部变量包含全局局部自定义变量会按字母排序输出。示例查看当前用户家目录printenv HOMEecho $HOME自定义变量局部变量 全局变量1. 局部变量仅当前Shell可用定义规则• 变量名、等号、值中间不能有空格• 字符串带空格时用单引号包裹内容• 仅当前终端窗口生效新开/重启终端直接消失。# 正确写法namexiaomingsentenceI am a linux beginner# 错误写法等号两边空格会报错name xiaoming关键特性• 在父Shell定义局部变量进入子Shell后无法读取• 在子Shell定义局部变量退出子Shell回到父Shell变量直接消失原理父子Shell是独立进程内存空间隔离局部变量不会跨进程传递。2. 全局环境变量父子Shell通用用export把局部变量升级为全局环境变量子进程可以继承# 1. 先定义局部变量booklinux_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 当前用户数字IDSHELL 当前使用的解释器一般/bin/bashLINES 终端可见行数HOSTNAME 主机名称PATH环境变量1. PATH是什么PATH是系统用来查找命令/脚本文件的目录列表多个目录用冒号:分隔。输入ls、cd、自定义脚本时Shell会按PATH里的目录顺序挨个搜索可执行文件找不到就提示command not found。2. 临时修改PATH仅当前终端有效把自定义脚本目录追加到PATH不用每次输入./脚本名运行文件# 保留原有PATH新增当前目录export PATH$PATH:.3. 临时修改的局限仅本次打开的终端窗口生效关闭终端、重启系统后PATH会恢复系统默认配置新增目录直接失效。4. 脚本运行问题解释1. 只输入脚本文件名如test.shPATH没有当前目录找不到文件报错2. ./test.sh可以运行./手动指定当前目录直接定位文件3. 追加当前目录到PATH后直接输入文件名就能运行4. 重启系统后失效临时环境变量不会持久保存。补充脚本运行前必须赋予执行权限 chmod ux xxx.sh否则路径正确也无法执行。环境变量持久化Shell启动配置文件临时变量重启就消失如果想要永久生效需要写入Shell启动文件。登录系统打开bash时会自动读取这些文件加载变量配置。1. 系统级配置所有用户生效/etc/profile系统全局启动文件每一个用户登录都会执行存放全用户通用环境变量。系统还会读取/etc/profile.d/目录下所有sh脚本统一加载系统配置。2. 用户专属配置仅当前用户生效存放于用户家目录$HOME下Shell按固定顺序读取找到第一个文件就停止读取剩余文件1. ~/.bash_profile优先读取2. ~/.bash_login3. ~/.profile以上文件内部一般会自动加载~/.bashrc存放个人自定义环境变量、别名、PATH配置。3. 修改后立即生效修改配置文件不会自动刷新终端执行下面命令立刻加载配置不用重启电脑source ~/.bashrc# 系统全局文件用source /etc/profileShell数组变量环境变量支持数组一个变量存储多组数据索引从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所有变量修改、删除操作不会影响父Shell5. 系统大写环境变量自定义变量建议小写避免冲突6. 数组变量可存储多个值支持单元素修改、删除、整体销毁。