
前言环境变量是Linux系统的“隐形管家”它们存储着Shell会话和工作环境的关键信息如当前用户的家目录、命令搜索路径、终端类型等。理解并熟练操作环境变量是掌握Linux系统管理和Shell编程的必经之路。本文将系统讲解环境变量的概念、全局与局部变量的区别、用户自定义变量的创建与删除、PATH变量的修改与持久化、系统启动文件的作用以及数组变量的使用。所有知识点均配有Xshell实操命令截图清单统一列在文末。一、什么是环境变量环境变量environment variable是其值在程序外部设置的变量通常通过操作系统或服务内置功能设置。环境变量由名称/值对组成VARIABLE_NAMEvalue可以在任何时间点进行引用。Bash Shell利用环境变量来存储有关Shell会话和工作环境的信息如当前用户、主目录、终端类型、命令搜索路径等。这项特性允许你在内存中存储数据以便程序或Shell中运行的脚本能够轻松快速地访问到它们。 简单理解环境变量就像系统设置的“全局参数”任何程序都可以读取它们来调整自己的行为。二、环境变量的分类Bash Shell中的环境变量分为两类类型 含义 可见范围全局变量 对Shell会话和所有生成的子Shell都可见 当前Shell及其所有子Shell局部变量 只对创建它们的Shell可见 仅在当前Shell中有效系统环境变量基本上都使用全大写字母以区别于普通用户的环境变量建议用户自定义变量使用小写字母避免冲突。三、查看环境变量3.1 查看全局变量命令 功能env 显示所有全局环境变量printenv 显示所有全局环境变量输出格式略有不同printenv 变量名 显示指定全局变量的值echo $变量名 显示指定变量的值适用于全局和局部实操演示bash查看所有全局变量envprintenv查看指定全局变量printenv HOMEprintenv PATH使用echo查看通用echo $HOMEecho $PATHecho $USER使用grep筛选env | grep PATHprintenv | grep HOME3.2 查看所有变量含局部变量命令 功能set 显示所有变量包括全局、局部、用户定义变量按字母顺序排序bash查看所有变量set筛选查看特定变量set | grep my_var 总结env和printenv仅显示全局变量set显示所有变量全局局部用户自定义。四、用户自定义变量4.1 创建局部变量语法变量名值等号两边不能有空格bash创建数值型局部变量my_num100创建字符串型局部变量不含空格my_nameZhangSan创建含空格的字符串必须用引号my_greeting‘Hello World’查看变量echo $my_numecho $my_nameecho $my_greeting⚠️ 重要规则变量名、等号、值之间不能有空格含有空格的字符串值必须用单引号或双引号括起来变量名区分大小写建议自定义变量使用小写字母避免覆盖系统环境变量4.2 创建全局变量步骤先创建局部变量再用export命令将其导出为全局变量。bash1. 创建局部变量my_global_var“I am global”2. 导出为全局变量export my_global_var3. 验证进入子Shell查看bashecho $my_global_var # 子Shell中可见4. 在子Shell中修改该变量my_global_var“New value in child”export my_global_varecho $my_global_var # 输出New value in child5. 退出子Shell回到父Shellexitecho $my_global_var # 父Shell中仍然是原来的值 核心结论子Shell可以继承父Shell的全局变量但子Shell中修改变量值不会影响父Shell。4.3 删除变量使用unset命令删除已存在的环境变量注意不要加$。bash创建并删除my_test“test”echo $my_testunset my_testecho $my_test # 输出为空已删除删除全局变量export my_global“hello”unset my_global⚠️ 规则用到变量值时使用操作变量名时不用操作变量名时不用操作变量名时不用如unset my_var。例外printenv HOME可以直接跟变量名不加$。4.4 变量持久化写入启动文件用户通过命令行创建的变量只在当前Shell中生效重启后会丢失。若要让变量永久生效需要将其写入启动文件中如~/.bashrc。bash编辑~/.bashrcvim ~/.bashrc在文件末尾添加一行export my_permanent_var“I will stay forever”保存退出后重新加载配置文件source ~/.bashrc验证echo $my_permanent_var 解释每次启动Shell时都会自动执行~/.bashrc中的命令因此写入其中的变量会持久存在。五、PATH环境变量5.1 什么是PATHPATH环境变量定义了Shell进行命令查找的目录列表用冒号:分隔。当你在命令行输入一个外部命令时Shell会按PATH中目录的顺序依次查找该命令的可执行文件。bash查看当前PATHecho $PATH输出示例/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin5.2 为什么可以直接输入命令像bash、ls、grep等命令之所以可以直接输入名称调用是因为它们所在的目录如/usr/bin已经在PATH环境变量中了。bash查看命令所在位置which bash # /usr/bin/bashwhich ls # /bin/ls5.3 添加自定义目录到PATH如果你自己安装了一个应用程序比如放在/home/zhang/zz/myapp想在任何目录下直接输入命令名就能运行需要将该目录添加到PATH中。临时添加仅当前Shell有效bashexport PATH$PATH:/home/zhang/zz/myapp验证echo $PATH永久添加写入~/.bashrcbashecho export PATHPATH:/home/zhang/zz/myapp′ /.bashrcsource /.bashrc解释PATH:/home/zhang/zz/myapp ~/.bashrc source ~/.bashrc 解释PATH:/home/zhang/zz/myapp′/.bashrcsource/.bashrc解释PATH会展开为原有路径:后追加新目录实现“在原路径基础上增加”。六、存放系统环境变量的文件登录Linux系统时Bash会从多个启动文件中读取命令以设置环境变量。6.1 系统级启动文件文件 说明/etc/profile 系统主启动文件所有用户登录时都会执行/etc/bash.bashrc 包含系统环境变量每次启动Bash时执行/etc/profile会通过for语句迭代/etc/profile.d/目录下的所有.sh脚本文件实现模块化配置。6.2 用户级启动文件按执行顺序文件按优先级 说明$HOME/.bash_profile 用户专属优先执行如果存在$HOME/.bash_login 如果.bash_profile不存在则执行$HOME/.profile 如果上述两个都不存在则执行$HOME/.bashrc 最常用每次启动交互式Shell时执行 实际建议一般将自定义环境变量写入~/.bashrc它会在每次打开终端时生效且不影响系统其他用户。七、数组变量Bash Shell支持一维数组不支持多维数组数组可以存储多个值。7.1 定义数组bash语法array_name(value_1 value_2 … value_n)元素之间用空格分隔my_array(apple banana orange grape)7.2 访问数组元素bash访问单个元素索引从0开始echo ${my_array[0]} # appleecho ${my_array[2]} # orange访问所有元素使用*或echo ${my_array[*]} # apple banana orange grapeecho ${my_array[]} # apple banana orange grape查看数组元素个数echo ${#my_array[*]} # 47.3 修改和删除数组bash修改指定索引的值my_array[1]blueberryecho ${my_array[*]} # apple blueberry orange grape删除数组中的某个元素保留索引位置unset my_array[2]echo ${my_array[*]} # apple blueberry grape删除整个数组unset my_arrayecho ${my_array[*]} # 输出为空 注意unset删除某个索引上的值后该索引位置仍然存在值为空但元素个数会减少。八、知识框架体系 环境变量整体框架textLinux环境变量├── 定义名称/值对存储Shell会话和工作环境信息├── 分类│ ├── 全局变量对所有子Shell可见│ │ └── 查看env, printenv, echo变量│└──局部变量仅当前Shell可见│└──查看set含所有变量├──用户自定义变量│├──创建局部变量名值等号无空格│├──导出全局export变量名│├──删除变量unset变量名不加变量 │ └── 局部变量仅当前Shell可见 │ └── 查看set含所有变量 ├── 用户自定义变量 │ ├── 创建局部变量名值等号无空格 │ ├── 导出全局export 变量名 │ ├── 删除变量unset 变量名不加变量│└──局部变量仅当前Shell可见│└──查看set含所有变量├──用户自定义变量│├──创建局部变量名值等号无空格│├──导出全局export变量名│├──删除变量unset变量名不加│ └── 持久化写入 ~/.bashrc source├── PATH变量│ ├── 作用定义命令查找目录冒号分隔│ ├── 临时添加export PATHPATH:/新目录│└──永久添加写入 /.bashrc├──启动文件│├──系统级/etc/profile,/etc/bash.bashrc│└──用户级 /.bashprofile, /.bashlogin, /.profile, /.bashrc└──数组变量├──定义array(v1v2v3)├──访问PATH:/新目录 │ └── 永久添加写入 ~/.bashrc ├── 启动文件 │ ├── 系统级/etc/profile, /etc/bash.bashrc │ └── 用户级~/.bash_profile, ~/.bash_login, ~/.profile, ~/.bashrc └── 数组变量 ├── 定义array(v1 v2 v3) ├── 访问PATH:/新目录│└──永久添加写入/.bashrc├──启动文件│├──系统级/etc/profile,/etc/bash.bashrc│└──用户级/.bashprofile,/.bashlogin,/.profile,/.bashrc└──数组变量├──定义array(v1v2v3)├──访问{array[index]}${array[*]}所有├── 修改array[index]新值└── 删除unset array[index] 或 unset array 常用命令速查表命令 功能 示例env 显示所有全局变量 envprintenv 显示所有全局变量 printenv HOMEecho $变量 显示指定变量值 echoPATHset显示所有变量含局部set∣grepmy变量值创建局部变量myvarhelloexport变量导出为全局变量exportmyvarunset变量删除变量unsetmyvarexportPATHPATH set 显示所有变量含局部 set | grep my 变量值 创建局部变量 my_varhello export 变量 导出为全局变量 export my_var unset 变量 删除变量 unset my_var export PATHPATHset显示所有变量含局部set∣grepmy变量值创建局部变量myvarhelloexport变量导出为全局变量exportmyvarunset变量删除变量unsetmyvarexportPATHPATH:/new 追加路径到PATH —source 文件 重新加载启动文件 source ~/.bashrcalias 查看/创建别名 alias ll‘ls -l’九、练习题必做以下练习来自PPT中的3个练习题请按步骤完成。练习题1查看与验证环境变量查看env的输出查看printenv的输出查看set的输出在父Shell中查看$PWD变量进入子Shellbash在子Shell中查看$PWD变量观察是否一致练习题2全局与局部变量实验在父Shell中设置一个局部变量my_var“parent”进入子Shell查看my_var应该为空因为局部变量不继承在父Shell中导出变量export my_var再次进入子Shell查看my_var现在可见在子Shell中修改变量my_var“child”并重新导出退出子Shell在父Shell中查看my_var值仍为parent练习题3数组操作建立一个包含多组员名称的数组team(Alice Bob Charlie David)更改一位成员team[1]Bruce删除一位成员unset team[2]删除整个数组unset team第十部分截图清单