一、什么是环境变量环境变量是存储在操作系统中的一组名称-值配对如 VARIABLE_NAMEvalue它们用于存储Shell会话和工作环境的相关信息。之所以叫环境变量是因为它们定义了程序运行时所处的环境——比如当前用户是谁、家目录在哪里、命令应该去哪里找。环境变量的一大优势是在内存中存储数据程序和脚本可以快速访问到它们而无需每次都去读取配置文件。这是一种存储持久数据的简便方法。默认情况下Bash Shell会预设一些环境变量来定义系统环境。这些变量一部分继承自Unix Bourne Shell的传统变量另一部分是Bash自己新增的。系统环境变量通常使用全大写字母命名以区别于普通用户的自定义变量。二、全局环境变量与局部环境变量Bash Shell中的环境变量分为两类全局环境变量对于Shell会话和所有生成的子Shell都是可见的。当你登录系统或打开一个终端时系统会自动设置好一批全局环境变量比如 HOME用户家目录、PATH命令搜索路径、USER当前用户名等。使用 env 或 printenv 命令可以查看当前所有的全局环境变量。要查看某个具体全局变量的值可以用 printenv 变量名 或 echo $变量名。注意引用变量时必须加 $ 前缀例如 echo $HOME。全局环境变量有一个重要特性它们在子Shell中依然有效。当你在父Shell中执行 bash 命令进入子Shell后用 echo $HOME 查看会发现它的值和父Shell中完全一样。局部环境变量则相反它们只在定义它们的Shell进程中可见子Shell无法继承。Linux系统本身没有专门只显示局部变量的命令但 set 命令可以显示某个进程的所有环境变量包括全局变量、局部变量和用户自定义变量并按字母顺序排列。三、用户自定义变量创建局部变量用户可以使用等号自己创建局部变量变量名后跟等号和值。变量名区分大小写惯例是系统变量用大写自定义变量用小写避免与系统变量冲突。重要变量名、等号和值之间不能有空格。my_variableHello # 正确my_variable Hello # 错误等号两边不能有空格如果值包含空格必须用单引号括起来my_variable‘Hello World’局部变量只能在当前Shell中生效进入子Shell后无法访问。将局部变量导出为全局变量通过 export 命令可以将局部环境变量导出到全局环境中使其对子Shell可见export my_variable但要注意在子Shell中修改全局变量的值不会影响父Shell中该变量的值。因为子Shell会复制一份父Shell的环境变量两者是独立的。删除变量使用 unset 命令可以删除已存在的环境变量。注意引用变量时用 $但操作变量时如 unset不用 $unset my_variable # 正确unset $my_variable # 错误让变量永久生效通过 export 命令定义的变量在重启Shell后会被清除。如果想让它永久存在需要把 export 命令写入启动文件 ~/.bashrc 中这样每次启动Shell时都会自动执行该命令重新定义这个变量vim ~/.bashrcexport my_variable‘Hello World’source ~/.bashrc # 立即生效无需重启四、PATH环境变量PATH 是Linux系统中最重要的环境变量之一。当你在命令行中输入一个外部命令如 ls、grep时Shell需要去系统的某个目录中找到对应的程序文件来执行。PATH 环境变量就定义了Shell搜索这些程序的目录列表。PATH 中的多个目录使用冒号: 分隔。查看当前 PATH 值echo $PATH输出可能类似/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin当你输入 ls 时Shell会依次在 /usr/local/bin、/usr/bin、/bin 等目录中查找名为 ls 的程序直到找到为止。如何添加自定义目录到PATH 如果你自己下载了一个应用程序想在任何位置都能直接输入程序名来执行需要将其所在目录添加到 PATH 中export PATH$PATH:/home/用户名/myapp这条命令的含义是在原有 PATH 值的基础上追加一个新目录用 $PATH 保留原有值再在后面加冒号和新目录。添加后你就可以在任意目录下直接执行该程序了。注意这种方式同样是临时的重启Shell会失效。若要永久生效同样需要写入 ~/.bashrc 文件。五、存放系统环境变量的文件Bash Shell在启动时会自动读取一系列启动文件也称为环境文件来初始化环境。这些文件分为系统级和用户级两类。系统级启动文件/etc/profile系统默认的主启动文件每个用户登录时都会执行/etc/bash.bashrc系统级的bash配置文件用户级启动文件位于$HOME目录下以点号开头是隐藏文件 $HOME/.profile$HOME/.bashrc最常用每次启动交互式Shell时都会执行$HOME/.bash_login$HOME/.bash_profile登录Shell会按一定顺序检查这些文件并执行其中的命令。推荐做法用户自定义的环境变量通常写入 ~/.bashrc因为它会在每次启动交互式Shell时都被执行且不会干扰登录Shell的启动流程。六、数组变量Bash Shell支持一维数组可以存储多个值。数组用括号 () 表示元素之间用空格分隔my_array(value1 value2 value3 value4)引用数组元素需要用花括号和方括号索引从0开始echo ${my_array[0]} # 输出第一个元素echo ${my_array[2]} # 输出第三个元素echo ${my_array[*]} # 输出整个数组的所有元素用星号通配修改数组中的某个元素my_array[1]new_value # 修改索引为1的元素使用 unset 可以删除数组中的某个元素或整个数组unset my_array[1] # 删除索引为1的元素该位置变为空unset my_array # 删除整个数组env 或 printenv 命令的局部输出set 命令的局部输出比 env 多了局部变量父Shell和子Shell中 echo $PWD 的对比创建和导出变量数组变量操作
Linux环境变量详解:全局变量、局部变量、PATH与数组操作
一、什么是环境变量环境变量是存储在操作系统中的一组名称-值配对如 VARIABLE_NAMEvalue它们用于存储Shell会话和工作环境的相关信息。之所以叫环境变量是因为它们定义了程序运行时所处的环境——比如当前用户是谁、家目录在哪里、命令应该去哪里找。环境变量的一大优势是在内存中存储数据程序和脚本可以快速访问到它们而无需每次都去读取配置文件。这是一种存储持久数据的简便方法。默认情况下Bash Shell会预设一些环境变量来定义系统环境。这些变量一部分继承自Unix Bourne Shell的传统变量另一部分是Bash自己新增的。系统环境变量通常使用全大写字母命名以区别于普通用户的自定义变量。二、全局环境变量与局部环境变量Bash Shell中的环境变量分为两类全局环境变量对于Shell会话和所有生成的子Shell都是可见的。当你登录系统或打开一个终端时系统会自动设置好一批全局环境变量比如 HOME用户家目录、PATH命令搜索路径、USER当前用户名等。使用 env 或 printenv 命令可以查看当前所有的全局环境变量。要查看某个具体全局变量的值可以用 printenv 变量名 或 echo $变量名。注意引用变量时必须加 $ 前缀例如 echo $HOME。全局环境变量有一个重要特性它们在子Shell中依然有效。当你在父Shell中执行 bash 命令进入子Shell后用 echo $HOME 查看会发现它的值和父Shell中完全一样。局部环境变量则相反它们只在定义它们的Shell进程中可见子Shell无法继承。Linux系统本身没有专门只显示局部变量的命令但 set 命令可以显示某个进程的所有环境变量包括全局变量、局部变量和用户自定义变量并按字母顺序排列。三、用户自定义变量创建局部变量用户可以使用等号自己创建局部变量变量名后跟等号和值。变量名区分大小写惯例是系统变量用大写自定义变量用小写避免与系统变量冲突。重要变量名、等号和值之间不能有空格。my_variableHello # 正确my_variable Hello # 错误等号两边不能有空格如果值包含空格必须用单引号括起来my_variable‘Hello World’局部变量只能在当前Shell中生效进入子Shell后无法访问。将局部变量导出为全局变量通过 export 命令可以将局部环境变量导出到全局环境中使其对子Shell可见export my_variable但要注意在子Shell中修改全局变量的值不会影响父Shell中该变量的值。因为子Shell会复制一份父Shell的环境变量两者是独立的。删除变量使用 unset 命令可以删除已存在的环境变量。注意引用变量时用 $但操作变量时如 unset不用 $unset my_variable # 正确unset $my_variable # 错误让变量永久生效通过 export 命令定义的变量在重启Shell后会被清除。如果想让它永久存在需要把 export 命令写入启动文件 ~/.bashrc 中这样每次启动Shell时都会自动执行该命令重新定义这个变量vim ~/.bashrcexport my_variable‘Hello World’source ~/.bashrc # 立即生效无需重启四、PATH环境变量PATH 是Linux系统中最重要的环境变量之一。当你在命令行中输入一个外部命令如 ls、grep时Shell需要去系统的某个目录中找到对应的程序文件来执行。PATH 环境变量就定义了Shell搜索这些程序的目录列表。PATH 中的多个目录使用冒号: 分隔。查看当前 PATH 值echo $PATH输出可能类似/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin当你输入 ls 时Shell会依次在 /usr/local/bin、/usr/bin、/bin 等目录中查找名为 ls 的程序直到找到为止。如何添加自定义目录到PATH 如果你自己下载了一个应用程序想在任何位置都能直接输入程序名来执行需要将其所在目录添加到 PATH 中export PATH$PATH:/home/用户名/myapp这条命令的含义是在原有 PATH 值的基础上追加一个新目录用 $PATH 保留原有值再在后面加冒号和新目录。添加后你就可以在任意目录下直接执行该程序了。注意这种方式同样是临时的重启Shell会失效。若要永久生效同样需要写入 ~/.bashrc 文件。五、存放系统环境变量的文件Bash Shell在启动时会自动读取一系列启动文件也称为环境文件来初始化环境。这些文件分为系统级和用户级两类。系统级启动文件/etc/profile系统默认的主启动文件每个用户登录时都会执行/etc/bash.bashrc系统级的bash配置文件用户级启动文件位于$HOME目录下以点号开头是隐藏文件 $HOME/.profile$HOME/.bashrc最常用每次启动交互式Shell时都会执行$HOME/.bash_login$HOME/.bash_profile登录Shell会按一定顺序检查这些文件并执行其中的命令。推荐做法用户自定义的环境变量通常写入 ~/.bashrc因为它会在每次启动交互式Shell时都被执行且不会干扰登录Shell的启动流程。六、数组变量Bash Shell支持一维数组可以存储多个值。数组用括号 () 表示元素之间用空格分隔my_array(value1 value2 value3 value4)引用数组元素需要用花括号和方括号索引从0开始echo ${my_array[0]} # 输出第一个元素echo ${my_array[2]} # 输出第三个元素echo ${my_array[*]} # 输出整个数组的所有元素用星号通配修改数组中的某个元素my_array[1]new_value # 修改索引为1的元素使用 unset 可以删除数组中的某个元素或整个数组unset my_array[1] # 删除索引为1的元素该位置变为空unset my_array # 删除整个数组env 或 printenv 命令的局部输出set 命令的局部输出比 env 多了局部变量父Shell和子Shell中 echo $PWD 的对比创建和导出变量数组变量操作