一、什么是环境变量1.1 概念理解环境变量Environment Variable是操作系统中一种动态命名的值其值在程序外部设置通过操作系统或微服务内置的功能进行配置。环境变量由名称/值对组成格式为bashVARIABLE_NAMEvalue1.2 环境变量的作用存储有关Shell会话和工作环境的信息在内存中存储数据便于程序或脚本快速访问提供持久数据的简便存储方式允许在进程间传递配置信息1.3 查看环境变量bash# 查看所有全局环境变量 env # 查看所有全局环境变量与env类似 printenv # 查看特定环境变量 printenv HOME env | grep HOME # 使用echo显示环境变量注意需要加$符号 echo $HOME echo $PATH【实际操作截图】bash[rootlocalhost ~]# env HOSTNAMElocalhost.localdomain SHELL/bin/bash TERMxterm-256color HISTSIZE1000 USERroot HOME/root PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin LANGen_US.UTF-8 [rootlocalhost ~]# echo $HOME /root [rootlocalhost ~]# printenv HOME /root二、全局环境变量与局部变量2.1 全局环境变量全局环境变量对Shell会话和所有生成的子Shell都是可见的。特性说明可见范围当前Shell及所有子Shell查看命令env、printenv、set命名规范通常使用全大写字母2.2 局部环境变量局部环境变量只能在定义它们的进程中可见子Shell无法继承。特性说明可见范围仅当前Shell进程查看命令set显示所有变量命名规范建议使用小写字母2.3 验证全局与局部的区别bash# 在父Shell中 [rootlocalhost ~]# my_varI am local [rootlocalhost ~]# export global_varI am global # 进入子Shell [rootlocalhost ~]# bash # 在子Shell中查看 [rootlocalhost ~]# echo $my_var # 无输出局部变量不可见 [rootlocalhost ~]# echo $global_var I am global # 全局变量可见 # 退出子Shell [rootlocalhost ~]# exit三、用户创建与删除环境变量3.1 创建局部变量语法格式bash变量名变量值注意事项变量名区分大小写变量名、等号和值之间不能有空格含有空格的字符串需要用单引号或双引号括起来用户自定义变量建议使用小写字母【实际操作示例】bash# 正确示例 [rootlocalhost ~]# nameZhang Jinyuan [rootlocalhost ~]# age20 [rootlocalhost ~]# schoolNorth Sichuan Medical University # 错误示例有空格 [rootlocalhost ~]# my_var hello -bash: my_var: command not found # 查看局部变量 [rootlocalhost ~]# echo $name Zhang Jinyuan [rootlocalhost ~]# set | grep name nameZhang Jinyuan3.2 创建全局变量方法先创建局部变量再使用export导出到全局环境。bash# 第一步创建局部变量 [rootlocalhost ~]# my_globalHello Global # 第二步导出为全局变量 [rootlocalhost ~]# export my_global # 也可以一步完成 [rootlocalhost ~]# export my_global2Hello World【验证全局变量】bash[rootlocalhost ~]# export my_varGlobal Value [rootlocalhost ~]# echo $my_var Global Value # 进入子Shell验证 [rootlocalhost ~]# bash [rootlocalhost ~]# echo $my_var Global Value # 子Shell中可见 # 在子Shell中修改变量 [rootlocalhost ~]# my_varNew Value [rootlocalhost ~]# export my_var [rootlocalhost ~]# echo $my_var New Value # 退出子Shell [rootlocalhost ~]# exit [rootlocalhost ~]# echo $my_var Global Value # 父Shell中值不变3.3 删除环境变量命令格式bashunset 变量名注意unset命令中引用环境变量时不要使用$符号。bash# 删除变量 [rootlocalhost ~]# my_testtest [rootlocalhost ~]# echo $my_test test [rootlocalhost ~]# unset my_test [rootlocalhost ~]# echo $my_test # 无输出变量已被删除3.4 永久保存环境变量用户自己定义的环境变量重新启动Shell后会被删除。若需永久保存需要将export命令写入启动文件。bash# 编辑 .bashrc 文件 [rootlocalhost ~]# vim ~/.bashrc # 在文件末尾添加 export my_permanent_varI am permanent # 使配置立即生效 [rootlocalhost ~]# source ~/.bashrc # 验证 [rootlocalhost ~]# echo $my_permanent_var I am permanent四、PATH环境变量详解4.1 PATH的概念PATH环境变量定义了Shell进行命令和程序查找的目录列表。当你在命令行输入一个命令时Shell会按照PATH中定义的目录顺序依次查找对应的可执行文件。bash# 查看当前PATH [rootlocalhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/binPATH的特点目录之间使用冒号:分隔查找顺序从左到右找到第一个匹配的命令后停止搜索4.2 查看命令所在路径bash# 查看命令的完整路径 [rootlocalhost ~]# which bash /usr/bin/bash [rootlocalhost ~]# whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz4.3 添加自定义目录到PATH临时添加仅当前会话有效bash# 追加新目录到PATH末尾 [rootlocalhost ~]# export PATH$PATH:/home/zhang/myapp # 验证 [rootlocalhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/zhang/myapp # 添加到PATH开头优先查找 [rootlocalhost ~]# export PATH/home/zhang/myapp:$PATH永久添加写入配置文件bash# 编辑 .bashrc 文件 [rootlocalhost ~]# vim ~/.bashrc # 添加以下内容到文件末尾 export PATH$PATH:/home/zhang/myapp # 使配置生效 [rootlocalhost ~]# source ~/.bashrc4.4 多用户共享PATH配置bash# 编辑 /etc/profile对所有用户生效 [rootlocalhost ~]# vim /etc/profile # 添加 export PATH$PATH:/usr/local/myapp/bin # 使所有用户生效 [rootlocalhost ~]# source /etc/profile五、存放系统环境变量的文件5.1 登录Shell启动文件当用户登录Linux系统时bash shell会作为登录Shell启动并按以下顺序读取启动文件启动文件作用范围说明/etc/profile系统全局所有用户登录时执行~/.bash_profile用户个人用户登录时执行~/.bash_login用户个人若没有.bash_profile则执行~/.profile用户个人若前两者都没有则执行~/.bashrc用户个人每次启动新Shell时执行5.2 各文件详解/etc/profile系统默认的主启动文件对所有用户生效会遍历执行/etc/profile.d/目录下的所有.sh脚本bash# 查看 /etc/profile 内容 [rootlocalhost ~]# cat /etc/profile | head -20 # /etc/profile 会执行以下语句 for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done~/.bashrc用户最常用的配置文件每次启动交互式Shell时都会执行通常用于定义别名、函数和环境变量bash# 典型的 .bashrc 内容 [rootlocalhost ~]# cat ~/.bashrc # .bashrc # User specific aliases and functions alias rmrm -i alias cpcp -i alias mvmv -i # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific environment export EDITORvim export PATH$PATH:/home/user/bin5.3 启动文件的加载顺序text登录Shell启动顺序 1. /etc/profile 2. ~/.bash_profile (如果存在) 3. ~/.bash_login (如果.bash_profile不存在) 4. ~/.profile (如果前两者都不存在) 非登录Shell启动顺序 1. ~/.bashrc 2. /etc/bashrc5.4 配置文件生效方法bash# 方法一使用source命令 source ~/.bashrc # 方法二使用点号. . ~/.bashrc # 方法三重新登录或重启终端六、数组变量6.1 数组的基本概念Bash Shell只支持一维数组数组元素用空格分隔整个数组用括号 ()表示。语法格式basharray_name(value_1 value_2 value_3 ... value_n)6.2 数组的基本操作【创建数组】bash# 创建包含多个元素的数组 [rootlocalhost ~]# students(Zhang San Li Si Wang Wu Zhao Liu) # 查看整个数组 [rootlocalhost ~]# echo ${students[*]} Zhang San Li Si Wang Wu Zhao Liu【访问数组元素】bash# 访问指定索引的元素索引从0开始 [rootlocalhost ~]# echo ${students[0]} Zhang San [rootlocalhost ~]# echo ${students[2]} Wang Wu # 查看数组所有元素 [rootlocalhost ~]# echo ${students[]} Zhang San Li Si Wang Wu Zhao Liu [rootlocalhost ~]# echo ${students[*]} Zhang San Li Si Wang Wu Zhao Liu【获取数组长度】bash[rootlocalhost ~]# echo ${#students[]} 4 [rootlocalhost ~]# echo ${#students[*]} 4【修改数组元素】bash# 修改索引1的元素 [rootlocalhost ~]# students[1]Li Hua [rootlocalhost ~]# echo ${students[*]} Zhang San Li Hua Wang Wu Zhao Liu【添加数组元素】bash# 在末尾添加元素 [rootlocalhost ~]# students[4]Sun Qi [rootlocalhost ~]# echo ${students[*]} Zhang San Li Hua Wang Wu Zhao Liu Sun Qi【删除数组元素】bash# 删除指定索引的元素保留索引位置 [rootlocalhost ~]# unset students[2] [rootlocalhost ~]# echo ${students[*]} Zhang San Li Hua Zhao Liu Sun Qi # 删除整个数组 [rootlocalhost ~]# unset students [rootlocalhost ~]# echo ${students[*]} # 无输出数组已删除6.3 数组的遍历bash# 使用for循环遍历数组 [rootlocalhost ~]# students(Zhang Li Wang Zhao) [rootlocalhost ~]# for name in ${students[]}; do echo Student: $name done Student: Zhang Student: Li Student: Wang Student: Zhao七、实战练习题7.1 练习题1查看环境变量任务查看env的输出查看printenv的输出查看set的输出在父Shell中查看$PWD变量进入子Shell在子Shell中查看$PWD变量【实际操作】bash# 1. 查看env输出 [rootlocalhost ~]# env | head -10 HOSTNAMElocalhost.localdomain SHELL/bin/bash TERMxterm-256color HISTSIZE1000 USERroot HOME/root PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin PWD/root LANGen_US.UTF-8 # 2. 查看printenv输出与env类似 [rootlocalhost ~]# printenv | head -10 HOSTNAMElocalhost.localdomain SHELL/bin/bash TERMxterm-256color HISTSIZE1000 USERroot HOME/root PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin PWD/root LANGen_US.UTF-8 # 3. 查看set输出包含所有变量 [rootlocalhost ~]# set | head -20 BASH/bin/bash BASHOPTScheckwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES() BASH_ARGC() BASH_ARGV() BASH_CMDS() BASH_LINENO() BASH_SOURCE() BASH_VERSINFO([0]4 [1]2 [2]46 [3]2 [4]release [5]x86_64-redhat-linux-gnu) BASH_VERSION4.2.46(2)-release # 4. 在父Shell中查看PWD [rootlocalhost ~]# echo $PWD /root # 5. 进入子Shell查看PWD [rootlocalhost ~]# bash [rootlocalhost ~]# echo $PWD /root [rootlocalhost ~]# cd /tmp [rootlocalhost tmp]# echo $PWD /tmp [rootlocalhost tmp]# exit exit [rootlocalhost ~]# echo $PWD /root7.2 练习题2全局变量与子Shell任务在父Shell中设置变量export导出至全局环境进入子Shell中查看设置的变量在子Shell中给变量赋新值在子Shell中使用export将赋新值的变量导出至全局并查看退出子Shell查看父Shell中的该变量值【实际操作】bash# 1. 在父Shell中设置并导出全局变量 [rootlocalhost ~]# my_testOriginal Value [rootlocalhost ~]# export my_test [rootlocalhost ~]# echo $my_test Original Value # 2. 进入子Shell查看 [rootlocalhost ~]# bash [rootlocalhost ~]# echo $my_test Original Value # 3. 在子Shell中修改变量值 [rootlocalhost ~]# my_testNew Value in SubShell [rootlocalhost ~]# echo $my_test New Value in SubShell # 4. 导出修改后的值并查看 [rootlocalhost ~]# export my_test [rootlocalhost ~]# echo $my_test New Value in SubShell # 5. 退出子Shell查看父Shell中的值 [rootlocalhost ~]# exit exit [rootlocalhost ~]# echo $my_test Original Value7.3 练习题3数组操作任务建立一个多组员名称的数组更改一位成员删除一位成员删除数组【实际操作】bash# 1. 建立多组员名称的数组 [rootlocalhost ~]# team(Zhang Wei Li Na Wang Fang Liu Yang Chen Ming) [rootlocalhost ~]# echo Team members: ${team[*]} Team members: Zhang Wei Li Na Wang Fang Liu Yang Chen Ming [rootlocalhost ~]# echo Number of members: ${#team[]} Number of members: 5 # 2. 更改一位成员将索引2的Wang Fang改为Wang Jing [rootlocalhost ~]# team[2]Wang Jing [rootlocalhost ~]# echo After change: ${team[*]} After change: Zhang Wei Li Na Wang Jing Liu Yang Chen Ming # 3. 删除一位成员删除索引3的Liu Yang [rootlocalhost ~]# unset team[3] [rootlocalhost ~]# echo After deletion: ${team[*]} After deletion: Zhang Wei Li Na Wang Jing Chen Ming [rootlocalhost ~]# echo Number of members: ${#team[]} Number of members: 4 # 验证删除的索引位置 [rootlocalhost ~]# echo ${team[3]} # 无输出索引3已被删除但保留位置 # 4. 删除整个数组 [rootlocalhost ~]# unset team [rootlocalhost ~]# echo ${team[*]} # 无输出数组已删除八、总结与知识框架8.1 知识框架图textLinux环境变量 │ ├── 环境变量概述 │ ├── 定义名称/值对 (VARIABLE_NAMEvalue) │ ├── 作用存储Shell会话和工作环境信息 │ └── 查看命令env, printenv, echo │ ├── 变量分类 │ ├── 全局环境变量 │ │ ├── 特点对所有子Shell可见 │ │ └── 查看env, printenv │ └── 局部环境变量 │ ├── 特点仅对当前Shell可见 │ └── 查看set │ ├── 变量操作 │ ├── 创建变量名值 │ ├── 导出export 变量名 │ ├── 删除unset 变量名 │ └── 永久保存写入 ~/.bashrc │ ├── PATH环境变量 │ ├── 作用定义命令查找路径 │ ├── 查看echo $PATH │ └── 添加export PATH$PATH:/new/path │ ├── 启动文件 │ ├── /etc/profile (系统全局) │ ├── ~/.bash_profile │ ├── ~/.bash_login │ ├── ~/.profile │ └── ~/.bashrc (最常用) │ └── 数组变量 ├── 定义array(value1 value2 ...) ├── 访问${array[index]} ├── 修改array[index]new_value └── 删除unset array[index]8.2 核心命令速查表命令用途示例env查看所有全局变量envprintenv查看所有全局变量printenv HOMEecho $VAR显示变量值echo $PATHVARvalue创建局部变量nameJohnexport VAR导出为全局变量export nameunset VAR删除变量unset namesource file加载配置文件source ~/.bashrcset显示所有变量setwhich cmd查找命令路径which basharray(...)创建数组arr(a b c)8.3 重要概念总结全局变量 vs 局部变量全局变量用export导出对所有子Shell可见局部变量只在当前Shell中有效变量引用 vs 变量操作引用变量用$echo $HOME操作变量不用$unset HOMEPATH变量冒号分隔多个目录添加新目录export PATH$PATH:/new/path永久生效需写入~/.bashrc启动文件~/.bashrc是最常用的用户配置文件修改后需执行source ~/.bashrc使之生效数组变量Bash只支持一维数组索引从0开始用unset可删除数组元素或整个数组