Linux真小白入门教程第十集——环境变量
对于Linux来说,很多程序和脚本都要通过环境变量来获取系统的信息、存储临时数据和配置信息。
bash shell有一个叫做环境变量的特性来保存有关shell会话和工作环境的信息,它允许你在内存中存储数据,以便shell脚本能够访问到他们,这也是持久存储数据的简便方法。
bash shell 中环境变量分两类:全局环境变量和局部环境变量(不同Linux发行版本上,其专有的环境变量有可能会不一致)
全局环境变量对于shell会话和所有生成的子shell都是可见的,而局部环境变量则只对创建它的shell可见。这使得全局环境变量对那些所创建的子shell 想要获取到父shell信息的程序来说,非常有用。
Linux系统在开始bash回话时,就设置了一些全局环境变量(基本上全部使用大写字母,以区别普通用户的环境变量)
env或printenv命令可以查看全局变量
(登录方式也会影响到所设置的环境变量)
但是如果要显示个别环境变量的值,只能使用printenv
或者也可以使用echo,这是需要在变量前面加美元符号$
加上$符号,不仅仅是要显示变量当前的值,他能够让变量作为命令行参数。
比如:
局部环境变量:
只能在定义他们的进程中可见,Linux系统也默认定义了标准的局部环境变量。
set命令可以显示为某个特定进程设置的所有环境变量(包括全局和局部以及用户自定义变量)(Linux没有只显示局部环境变量的命令)
注意大小写区分全局和局部变量哦~
set、printenv、env命令之间的差异很细微,set会显示出所有局部、全局以及自定义变量,而且是按照字母顺序进行排序。而env和printenv命令是不会排序的,也不会输出局部和自定义变量。
设置用户自定义变量
可以在bash shell中直接设置自己的变量,启动bash shell后(或者执行了一个shell脚本),就能创建在这个shell 进程内可见的局部变量了。使用echo命令
可通过等号给环境变量赋值,值可以是数值或是字符串。
如果是带有空格的字符串,那么必须用双引号来界定字符串的头尾
没有单引号的话,bash shell会以为下一个词是另一个要执行的命令
(所有的系统的环境变量名均使用大写字母,这是bash shell的标准惯例。所以创建用户变量或者shell脚本时,请使用小写字母以区分开来)
记住:子shell本身的环境变量在它自己的子shell中不可见,退回上一层shell后,才可使用。(没有继承关系,完全私有)
如果一个进程设定了一个全局环境变量,那么其创建的子进程,是对其子进程可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。
export命令可以完成这项任务 ,明显在子shell中可以正确显示my_variable变量。
然而修改子shell 中全局环境变量并不会影响到父shell中该变量的值。
如上所示,改变仅在子shell中生效。
子shell甚至无法使用export 命令改变父shell中全局环境变量的值(依然不变)。
使用unset命令可以删除已存在的环境变量
unset my_variable
(使用$是要用到变量
不带$是要操作变量),记住区别(printenv是一个例外)。
在处理全局环境变量时,仅在子shell中删除,其仍然在父shell中生效。
一些默认的shell环境变量
默认情况下,bash shell会用一些特定的环境变量来定义系统环境,下面是一小部分例子。
记住并不是每个默认的环境变量都对应有值,也可能为空
设置PATH环境变量
当在shell命令行界面输入一个外部命令时,shell必须搜索系统来找到对应的程序,PATH环境变量定义了用于进行命令和程序查找的目录。
和Windows的PATH基本一致,只是Linux使用:冒号进行分隔,Windows使用;分号进行分隔。
将可执行程序的目录放入PATH,即可执行或者使用。
通常使用的方法:
PATH = $PATH:.
使用单点符,将当前目录加入到PATH环境变量,并且这个修改只能持续到shell退出或者系统重启。
那么如何持久化环境变量呢~不同的shell启动方式,对应在系统不同的启动文件中,将环境变量加入到对应的启动文件(修改)之后,才能完成持久化的修改。(但是更新Linux版本后,所有文件都会跟着更新,定制的设置就不会再存在。最好是在/etc/profile.d文件中创建一个以.sh结尾的文件,把所有的新的或者修改过得全局环境变量都设置在这个文件中)
在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程。
环境变量还有一个特点就是可以作为数组使用,可以存储多个值的变量,可以单独引用还可以作为一个数组来使用。
要给某个环境变量设置多个值,把值放在括号中,值与值之间用空格分隔。
my_variable = (a,b,tow,God)
要引用一个单独的数组元素,就必须用代表它在数组中位置的数值作为索引值。
echo ${my_variable[2]}
记得索引值从0开始
要显示整个数组,则使用*号
echo ${my_variable[*]}
也可对数组中的值进行修改
my_variable[2] = today
使用unset删除某个值时,只能对值进行删除,位置上为空。
unset my_variable
即可删除整个数组
(数组不经常用到,因为一方面比较麻烦,一方面移植性也不好)