Linux之Shell变量和环境变量

Shell 变量

所谓变量就是计算机中用于记录一个值(不一定是数值,也可以是字符或字符串)的符号,而这些符号将用于不同的运算处理中。通常变量与值是一对一的关系,可以通过表达式读取它的值并赋值给其它变量,也可以直接指定数值赋值给任意变量。

我们可以用 declare 预声明一个变量,或者即用即创建

Name=zihao(变量名不需要加美元符号$,PHP语言中变量需要)

需要特别注意的是:变量名和等号之间不能有空格。


同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

变量的使用

  • 建议使用变量时,将变量名加上花括号。有利于帮助解释器识别变量的边界,这是个好习惯。

只读变量

在变量被创建了之后,使用 readonly 命令可以将变量定义为只读变量,只读变量的值只能被删除、但是不能被修改。

格式:“readonly 变量名”


删除变量

使用 unset 命令可以删除变量。




环境变量

Shell 的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。

也就是说,Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。


通常我们会涉及到的变量类型有三种:

  1. 当前 Shell 进程私有用户自定义变量,只在当前 Shell 中有效。
  2. Shell 本身内建的变量。
  3. 从自定义变量导出的环境变量。

注: 为了与普通变量区分,通常我们习惯将环境变量名设为大写。



命令的查找顺序

环境变量的作用是什么呢?或者说,当我们在 Shell 中输入一个命令,Shell 是怎么知道去哪找到这个命令然后执行的呢?这是通过环境变量 PATH 来进行搜索的。

在Linux系统中一切都是文件,Linux命令也不例外。那么,在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?简单来说,命令在Linux中的执行分为4个步骤。

第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。

第2步:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用alias命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”。若要取消一个命令别名,则是用unalias命令,格式为“unalias 别名”。我们之前在使用rm命令删除文件时,Linux系统都会要求我们再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令。

第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令。

第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,输入命令时Bash解释器就会在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到 Bash 解释器对 Linux命令的查找。



自定义环境变量

其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们也可以自行创建变量,来满足工作需求。


但是,这样的环境变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用export命令将其提升为全局变量,这样其他用户也就可以使用它(全局变量:多用户都能使用)


永久生效的环境变量

当关机后,或者关闭当前的 shell 之后,环境变量就会清空。如何让环境变量永久生效呢?

按变量的生存周期来划分,Linux 变量可分为两类:

  1. 永久的:需要修改配置文件,变量永久生效;

  2. 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。


关于配置文件

两个关于变量的重要文件: /etc/bashrc 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。

这个 .profile 只对当前用户永久生效。而写在 /etc/profile 里面的是对所有用户永久生效,所以如果想要添加一个永久生效的环境变量,只需要打开 /etc/profile,在最后加上你想添加的环境变量就好了。