code学习

一篇文章看懂Linux环境变量(局部环境变量、全局环境变量、持久化环境变量)

文章目录

  • ​​0 背景​​
  • ​​1 环境变量概述​​
  • ​​1.1 全局环境变量​​
  • ​​1.2 局部环境变量​​
  • ​​2创建环境变量​​
  • ​​2.1 局部环境变量​​
  • ​​2.2 全局环境变量​​
  • ​​3 删除环境变量​​
  • ​​4 设置PATH环境变量​​
  • ​​4.1 持久化环境变量​​
  • ​​4.1.1 情况1:默认登录shell​​
  • ​​4.1.2 情况2:为非登录shell的交互式shell​​
  • ​​4.1.3 情况3:为运行脚本的非交互shell​​
  • ​​4.2 创建持久化环境变量的建议​​
  • ​​5 数据数组​​

0 背景

本文内容总结自《Linux命令行与shell脚本编程大全》。

1 环境变量概述

定义:在内存中存储有关shell会话和工作环境的信息,以便程序或shell中运行的脚本能够轻松访问到它们。

全局环境变量对于shell会话和所有生成的子shell都是可见的;局部变量则只对创建它们的shell可见。

1.1 全局环境变量

  • 查看方法:​

    ​env​

    ​​或​

    ​printenv​

    ​命令.
  • 显示个别环境变量的值,可以使用printenv命令,但是不要用env命令.
  • 可以使用echo显示变量的值【下引用某个环境变量的时候,必须在变量前面加上一个美元符($)。】

1.2 局部环境变量

  • 查看方法:在Linux系统并没有一个只显示局部环境变量的命令,​

    ​set​

    ​命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

2创建环境变量

2.1 局部环境变量

my_variable=Hello

my_variable="Hello World" 

echo $my_variable      

⚠️注意:

  • 所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。
  • 变量名、等号和值之间没有空格.
  • 如果变量中含有空格的字符串值,则使用双引号包裹起来。
  • 命令中单引号、双引号、无引号的区别:
  • 单引号:将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么;
  • 双引号:如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来
  • 无引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出

2.2 全局环境变量

创建方法:先创建一个局部环境变量,然后再把它导出到全局环境中。【子shell ​

​export​

​导出的变量,父shell接收不到】

⚠️注意:

  • 修改子shell中全局环境变量并不会影响到父shell中该变量的值。

3 删除环境变量

使用​

​unset​

​​命令完成这个操作。【在unset命令中引用环境变量时,记住不要使用​

​$​

​。】

⚠️注意:

如果要用到变量,使用​

​$​

​​;如果要操作变量,不使用​

​$​

​。这条规则的一个例外就是使用printenv显示某个变量的值。

4 设置PATH环境变量

PATH环境变量定义了用于进行命令和程序查找的目录。

临时添加PATH环境变量:

PATH=$PATH:/home/christine/Scripts      

对PATH变量的修改只能持续到退出或重启系统.

4.1 持久化环境变量

linux启动shell时,会从启动文件或环境文件中读取环境变量。

4.1.1 情况1:默认登录shell

  • ​/etc/profile​

  • ​$HOME/.bash_profile​

  • ​$HOME/.bashrc​

  • ​$HOME/.bash_login​

  • ​$HOME/.profile​

​/etc/profile​

​​文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。剩余的四个文件【它们是隐藏文件】,提供一个用户专属的启动文件来定义该用户所用到的环境变量,大多数Linux发行版只用这四个启动文件中的一到两个。shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略【$HOME表示的是某个用户的主目录。它和波浪号(​

​~​

​)的作用一样。】:

$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile      

这个列表中并没有​

​$HOME/.bashrc​

​文件。这是因为该文件通常通过其他文件运行的。

Ubuntu发行版中环境变量包含在​

​/etc/bash.bashrc​

​的文件,但是,在的CentOS发行版的/etc/profile文件中,并没有出现这个文件。

注意⚠️:

  • 有些Linux 发行版使用了可拆卸式认证模块( Pluggable AuthenticationModules ,PAM)。在这种情况下,PAM文件会在bash shell启动之前处理,这些文件中可能会包含环境变量

4.1.2 情况2:为非登录shell的交互式shell

概念:bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么你启动的shell叫作交互式shell。

如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的​

​.bashrc​

​文件。

.bashrc文件有两个作用:

  • 一是查看/etc目录下通用的bashrc文件,
  • 二是为用户提供一个定制自己的命令别名和私有脚本函数(将在第17章中讲到)的地方。

4.1.3 情况3:为运行脚本的非交互shell

概念:系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符。

bash shell提供了​

​BASH_ENV环境变量​

​,当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。

如果BASH_ENV变量没有设置,由于有些shell脚本是通过启动一个子shell来执行的,子shell可以继承父shell导出过的变量。如果父shell是登录shell,在​

​/etc/profile、/etc/profile.d/*.sh和$HOME/.bashrc​

​文件中设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。

对于那些不启动子shell的脚本,变量已经存在于当前shell中了,所以就算没有设置BASH_ENV,也可以使用当前shell的局部变量和全局变量。

注意⚠️:如果父shell设置但并未导出的变量都是局部变量,子shell无法继承局部变量。

4.2 创建持久化环境变量的建议

全局环境变量来说(Linux系统中所有用户都需要使用的变量),可能更倾向于将新的或修改过的变量设置放在/etc/profile文件中,但是如果你升级了所用的发行版,这个文件也会跟着更新,那你所有定制过的变量设置可就都没有了。

最好是在​

​/etc/profile.d​

​目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。

在大多数发行版中,存储个人用户永久性bash shell变量的地方是​

​$HOME/.bashrc​

​​文件,适用于所有类型的shell进程。但如果设置了​

​BASH_ENV变量​

​​,那么记住,除非它指向的是​

​$HOME/.bashrc​

​,否则你应该将非交互式shell的用户变量放在别的地方。

5 数据数组

要引用一个单独的数组元素,就要使用方括号+数值索引值【环境变量数组的索引值都是从零开始】.要显示整个数组变量,可用星号作为通配符放在索引值的位置。

$ mytest=(one two three four five)
$ echo $mytest
one
$ echo ${mytest[2]}
three      

继续阅读