1. 概述
1.1 分类
环境变量分为以下三种:
- 局部(临时)环境变量:在所运行的脚本或 shell 中存在
- 用户环境变量:在当前登录的用户环境中存在
- 系统环境变量:在当前系统中存在,可以被任意用户、脚本或 shell 访问到
1.2 访问顺序
优先从局部环境变量开始,找不到的就到用户环境变量中,最后再到系统环境变量中访问。
2. Windows
2.1 临时环境变量
在 Windows 下,打开 CMD(命令提示符),输入:
echo %user%
SET user=xkc
echo %user%
echo %username%
echo %user%/%username%
输出结果如下图:
通过执行上述命令,我们发现 user 是一个变量,里面存放的值会被用户修改变化,但使用这个变量名 user,我们始终可以获取到里面的最新值。
- SET 的环境变量仅在当前 CMD 窗口下有效,并且会随着 CMD 的关闭而释放;
- 如需永久保留环境变量,则需要在系统设置中配置并保存。
2.2 全局环境变量
全局环境变量分为 用户环境变量 和 系统环境变量:
-
用户环境变量:仅在当前用户登录的环境下起作用,如切换成其他用户,那么其环境变量也随之发生变化
-
系统环境变量:不管是哪个用户登录在当前系统中,都共享使用的环境变量
-
设置
3. Linux
环境变量是用来存储shell会话和工作环境的相关信息。环境变量允许在内存中存储数据,以便shell中运行的程序或脚本能够轻松访问到这些数据。
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部环境变量只对创建它的shell可见。
3.1 临时环境变量(或称用户临时变量)
Linux系统默认定义了标准的局部环境变量,不过用户也可以定义自己的局部变量,这些变量被称为用户自定义局部变量。没有命令可以只显示局部环境变量。set
命令可以显示特定进程的所有环境变量,包括局部变量、全局变量以及用户自定义变量。
变量名区分大小写,系统环境变量用的都是大写字母,坚持使用小写字母命名用户自定义的局部变量,能够让你避免不小心与系统环境变量同名可能带来的灾难。
Shell 变量名在定义时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可以使用下划线 _
,不能使用 -
,也不能使用标点符号等。
a=123
# 变量介绍:等号两侧不能有空格,否则bash shell会将其视为单独的命令
echo $a # 123
将命令的返回值赋给变量 【以输出日期为例】
- A=`date`: 反引号,运行里面的命令,并把结果返回给变量 A
A=$(date)
: 等价于反引号
- 如果写 A=date,表示把单词赋值给A
unset var_name
# 清除变量,不要使用$
export 变量名
# 将局部变量导出为全局变量
export 和 不使用 export 的主要区别在于变量的作用范围和可见性:
- 使用 export:通过使用 export 命令将变量导出为环境变量,这个变量不仅在当前 shell 进程中有效,而且在其子进程中也是可见的。这意味着,如果其他进程或脚本需要访问这个变量,它们可以通过环境变量的方式获取到这个变量的值。被导出的变量可以被其他进程或脚本访问,具有继承性,即被子进程继承。
- 不使用 export:这个变量就仅仅在当前shell进程中有效,不会被其他进程或脚本访问到。这样的变量只在当前的 shell 进程中有效,不具备继承性,即不会被子进程继承。
可以将设置变量和导出变量放在一个命令里完成。
例:
修改子shell中全局环境变量并不会影响父shell中改变量的值,子shell也无法使用export
命令改变父shell中全局变量的值。(删除也是如此)
3.2 全局环境变量
可以使用env
或printenv
命令来查看全局变量
登录方式也会影响设置的环境变量,要显示个别环境变量的值,可以使用printenv
命令,但不要使用env
命令。
也可以使用echo
命令显示变量的值,在引用某个环境变量时,必须在该变量名前加上符号"$"
。
使用echo命令时,在变量名前加上"$"
不仅仅能够显示变量当前的值,还能让变量作为其他命令的参数。
3.2.1 用户环境变量
在Linux系统中,用户环境变量的配置文件主要有两个,分别是 .bashrc
和 .bash_profile
(或 .profile
)。这些文件通常位于用户的主目录下,并且是隐藏文件,需要通过特定的命令来查看和编辑。
.bashrc
:这个文件用于配置与 Bash Shell 相关的环境变量和个性化设置,如命令别名、PATH 环境变量的设置、命令提示符的格式等。它会在每次启动新的非登录 Shell 时自动执行。.bash_profile
(或.profile
):这个文件用于配置登录 Shell 的环境变量,它会在用户登录时执行一次。如果系统中没有.bash_profile
文件,那么.profile
文件会被读取。
例:
输入nano .bashrc #编辑.bashrc文件
输入aaa=111
按Ctrl+X键保存
按Y键 #确认修改
输入cat .bashrc #查看.bashrc文件内容,发现已添加aaa=111
输入echo $aaa #无法显示
输入bash
输入echo $aaa
成功输出111
输入mkdir test #创建test文件夹
输入cd test
输入nano hello.sh
输入AAA="monkey brother monkey brother you are so great"
echo $AAA
按Ctrl+X键保存退出,然后按Y确认修改。
输入ll -a
发现新增hello.sh文件
输入./hello.sh #执行hello.sh
提示权限不够
输入chomod +x hello.sh #给hello.sh增加执行权限
输入./hello.sh
成功输出monkey brother monkey brother you are so great
输入cd .. #返回上级目录
输入./hello.sh
提示没有文件或目录 #路径改变导致无法执行
输入./test/hello.sh
成功输出monkey brother monkey brother you are so great
输入hello.sh
提示未找到命令
输入nano .bash_profile
在PATH那一行最后添加:~/test 保存退出
# PATH环境变量定义了用于查找命令和程序的目录,用冒号分隔
输入source .bash_profile
输入hello.sh
成功输出monkey brother monkey brother you are so great
3.2.2 系统环境变量
在 Linux 系统中,系统环境变量的配置文件主要有以下几个:
-
/etc/environment
:这是一个全局配置文件,用于设置系统级别的环境变量。它会在系统启动时被读取,并且对所有用户生效。 -
/etc/profile
:这个文件用于设置全局的 shell 环境变量,它会在用户登录时被读取。它通常包含一些系统级别的环境变量设置,如 PATH、LANG 等。 -
/etc/profile.d/
目录下的脚本文件:这个目录下存放了一系列的 shell 脚本文件,每个文件都可以设置一些环境变量。这些脚本文件会在/etc/profile
被读取时自动执行。 -
/etc/bash.bashrc
:这个文件用于设置 Bash shell 的全局环境变量。它会在新的 Bash shell 启动时被读取。 -
/etc/sysconfig
目录下的配置文件:这个目录下有一些特定的配置文件,如sysconfig/network
、sysconfig/java
等,它们也可以设置一些环境变量。
例:
输入cd /etc #切换/etc目录
输入cd profile.d
输入ll -a #以列表形式查看目录,包括隐藏文件
输入nano hello.sh #创建并编辑hello脚本
输入hello="hello monkey king"
输入ll -a #以列表形式查看目录,包括隐藏文件
发现新增hello.sh
输入source profile #使脚本文件中的命令和变量设置立即生效
输入echo $hello
输出hello monkey king
按Ctrl+Alt+F2 #切换控制台
登录用户,输入echo $hello
输出hello monkey king
3.2.3 source
source 命令在 Linux 系统中用于在当前 shell 会话中执行指定的脚本文件,从而使得脚本文件中的命令和变量设置立即生效。换句话说,source 命令可以让你在不重新启动 shell 的情况下,直接应用脚本文件中的更改。
因此,配置好全局环境变量后,还需要使用 source 命令来使该配置文件生效。
例如:source ~/.bashrc
3.3 数组变量
环境变量可以作为数组使用,要为某个环境变量设置多个值。可以把值放在"()"
中,值与值之间以空格分隔。
要引用单个数组元素,必须使用表示其在数组位置中的索引。索引要写在"[]"
中,$符号之后的所有内容要写在"{}"
中。环境变量数组的索引都是从0开始的。要显示整个数组的变量,可以用通配符"*"
作为索引,也可以改变某个索引位置上的值,甚至可以使用unset
命令来删除数组中的某个值。显示整个数组时看起来好像是其他索引填补了这个位置,实际上这个位置是空的。
有时候数组变量会将事情搞复杂,所以在shell脚本编程时并不常用,也不方便移植到其他shell环境。