Linux环境变量
一、全局环境变量
- 全局环境变量对于所有shell会话和生成的子shell都是可见。
- 查看所有全局变量
env
- 查看某个全局变量
printenv HISTSIZE
- 创建全局变量
- 先创建局部变量
my_variable="ouyang"
- 然后
export my_variable
- 先创建局部变量
- 父shell 创建全局环境变量,子shell能够得到,但是修改无效。子shell创建全局环境变量,父shell不能得到。
二、局部环境变量
- 局部变量只对创建的shell可见。
set
查看为某个特定进程设置的所有环境变量:局部+全局- 局部环境变量,子shell不能使用。
- 子shell定义的局部变量,父shell不能使用。
三、用户自定义变量
- 设置局部用户自定义变量
my_variable=hello
,不要加空格。 - 规范:系统环境变量名使用大写字母,用户自定义使用小写字母。
四、删除环境变量
unset my_variable
- 同样,在子shell中删除了环境变量,不能影响到父shell
五、默认的环境变量
BASH
当前shell实例的全路径名PATH
shell查找命令的目录列表,由冒号分隔- 增加path:
PATH=$PATH:/mypath
,注意不要漏了冒号
- 增加path:
PWD
当前工作目录
六、设置系统环境变量
6.1 登录shell
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
- shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略:
- $HOME/.bash_profile
- .bash_profile启动文件会先去检查HOME目录中是不是还有一个叫.bashrc的启动文件。如果有的话,会先执行启动文件里面的命令。
- $HOME/.bash_login
- $HOME/.profile
- 注意,这个列表中并没有
$HOME/.bashrc
文件。这是因为该文件通常通过其他文件运行的。
- $HOME/.bash_profile
6.2 交互式shell进程
- 如果bash不是登录系统时启动的,比如在命令行敲bash启动,那么就叫做交互式shell
- 如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。
6.3 非交互式shell
- 系统执行shell脚本时用的就是这种shell。
- 执行脚本,有时候是开启子shell,有时候是在本shell
- bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。
6.4 环境变量持久化
- 全局环境变量
- 将新的或修改过的变量放在
/etc/profile
文件中,但是如果升级了发行版,这个文件也会被更新。 - 可以在
/etc/profile.d
中创建一个以.sh
结尾的文件。把所有新的或修改过的全局环境变量设置在这个文件中。/etc/profile
文件在被 Shell 处理时,会自动加载/etc/profile.d
目录下所有以.sh
结尾的文件。因此,只需将变量配置文件放入该目录,便会自动生效,无需显式修改/etc/profile
文件。
- 将新的或修改过的变量放在
七、数组变量
-
要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
mytest=(one two three four five)
-
要引用一个单独的数组元素,就必须用代表它在数组中位置的数值索引值。索引值要用方括号括起来。
echo ${mytest[2]}
-
要显示整个数组变量,可用星号作为通配符放在索引值的位置。
echo ${mytest[*]}
-
删除某个索引位置的值
$ unset mytest[2] $ $ echo ${mytest[*]} one two four five $ $ echo ${mytest[2]} $ echo ${mytest[3]} four
- 其实没有真正“删除”,该位置为null了,所以打印全部的时候,2索引似乎“消失”了。但是单独打印2索引时,其实是null