环境变量可以使得 bash shell 存储有关 shell 会话和工作环境的信息,允许在内存中存储数据。
在 bash shell 中,环境变量分为:
- 全局变量
- 局部变量
全局变量对 shell 会话和所有生成的子 shell 都可见。局部变量只对创建他们的 shell 可见。
全局环境变量
- 变量名全部大写,以区别普通用户的环境变量
- 查看命令: env 或者 printenv 变量名,或者 $变量名
局部环境变量
- Linux 默认定义了标准的局部环境变量
- 没有命令能够只显示局部变量
- set 命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量、用户定义变量
用户定义变量
设置局部用户定义变量
如,定义 h 的值为 Hello World!。 注意,变量名、等号和值之间没有空格。
#step1
echo $h
#step2
h="Hello World!"
#step3 使用
echo $h
特点:只能在定义该变量的 shell 中使用。
设置全局环境变量
如,定义 h 的值为 Hello World!。
#step1
h="Hello World!"
#step2
export $h
# step3 使用
echo $h
特点:在子 shell 中也可以使用,子 shell 中可以修改,但不会影响父 shell 的变量值。
删除环境变量
如,删除上面定义的 h
#step1
unset h
#step2 查看
echo $h
特点:如果在子 shell 中删除,只会在子 shell 中生效。在父进程依然可以用。
默认的 shel 环境变量
通常,bash shell 已经用一些变量定义好了系统环境。
由于 bash shell 源于 Unix Bourne shell,因此保留了 Unix Bourne shell 的一些变量。当然还有自有的变量。详情请看纸质书籍的 p110 ~ p113 的两个表。
设置 PATH 环境变量
当你在 shell 中输入一个外部命令时,shell 会搜索你输入的命令。搜索的范围就是 PATH 环境变量定义好的。
如,在我的 Ubuntu 18.04 中:
#step1
echo $PATH
#结果
/usr/local/bin/jdk-10.0.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
目录使用冒号 : 分隔。如果你输入的命令不在 PATH 指定的任何一个目录下面,且又不是使用绝对路径的话,shell 就找不到该命令,无法执行操作。
添加
如,要添加 /opt/adb
#step1
PATH=$PATH:/opt/adb
这时候,在任何目录都可以执行 adb 命令了。但是如果退出了 shell 或者重启系统就失效了。
定位系统环境变量
在你登录 Linux 系统启动一个 bash shell 时,默认 bash 会从 启动文件/环境文件 查找命令。启动文件是哪些取决于你启动 bash shell 的方式。启动 bash shell 有三种:
- 登录时作为默认登录 shell
- 作为非登录 shell 的交互式 shell
- 作为运行脚本的非交互式 shell
登录 shell
从 5 个不同的启动文件里读取命令:
- /etc/profile
- ~/.bash_profile
- ~/.bashrc
- ~/.bash_login
- ~/.profile
其中 /etc/profile 是主启动文件。不同的 Linux 发行版在这里放了不同的命令。
~/ 下的启动文件,提供一个用户专属的启动文件。大多数的 Linux 的发行版只用到其中的一个到两个。
shell 会按照下列的顺序,运行第一个被找到的文件,余下的则忽略:
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc 通常通过其他文件运行。
交互式 shell
只会检查 ~/.bashrc
.bashrc 文件有两个作用:1.查看 /etc 下的 bashrc 文件,2.为用户提供一个定制自己的命令别名和私有脚本函数的地方。
非交互式 shel
系统执行 shell 脚本的时候。bash shell 会检查 BASH_ENV 来查看要执行的启动文件。如果有指定的文件 shell 就会执行,如果没有,就查看父 shell 的变量。对于不启动子 shell 的脚本,变量已经存在当前的 shell 里了。
环境变量持久化
在 /etc/profile.d 目录下创建一个 .sh 文件,把全局环境变量放在这里。
在大多数发行版中,存储个人用户永久性 bash shell 变量的地方是 ~/.bashrc
数组变量
就是给环境变量设置多个值。如:
mytest=(one two three four)
#显示某个索引的值
echo ${mytest[1]}
#显示所有的值
echo ${mytest[*]}
#改变某个索引的值
mytest[2]=second
#删除某个值
unset mytest[2]
注意:数组变量在 shell 脚本编程中不常用。