Shell变量作用域

Shell变量作用域教程

几乎所有的编程语言的变量都有作用域,Shell 中的变量同样有作用域,Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围)。

Shell变量作用域详解

在不同的作用域中,同名的变量不会相互干涉,Shell 中的变量作用域可以分为全局作用域、局部作用域和环境变量三种。

作用域 描述
全局变量 有的变量可以在当前 Shell 会话中使用,这叫做全局变量(global variable)
局部变量 有的变量只能在函数内部使用,这叫做局部变量(local variable)
环境变量 有的变量还可以在其它 Shell 中使用,这叫做环境变量(environment variable)

Shell全局变量

说明

所谓全局变量,就是指变量在当前的整个 Shell 会话中都有效。每个 Shell 会话都有自己的作用域,彼此之间互不影响。在 Shell 中定义的变量,默认就是全局变量。

案例

我们首先,打开一个 Shell,并定义一个 Shell 变量,具体代码如下:

name=haicoder

现在,我们在当前 Shell 中,输出该变量的值,具体命令如下:

echo $name

运行后,终端输出如下:

16_Shell变量作用域.png

我们看到,程序正确输出了该变量的值,现在,我们再次新开一个 Shell,再次访问该变量,具体命令如下:

echo $name

运行后,终端输出如下:

17_Shell变量作用域.png

我们看到,此时并没有获取到该变量的值,即,全局变量只能在当前 Shell 访问。

细节

需要强调的是,全局变量的作用范围是当前的 Shell 会话,而不是当前的 Shell 脚本文件,它们是不同的概念。打开一个 Shell 窗口就创建了一个 Shell 会话,打开多个 Shell 窗口就创建了多个 Shell 会话,每个 Shell 会话都是独立的进程,拥有不同的进程 ID。在一个 Shell 会话中,可以执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。

Shell局部变量

说明

Shell 也支持自定义函数,但是 Shell 函数和 C 语言C++Java 等其他编程语言函数的一个不同点就是,在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。

要想变量的作用域仅限于函数内部,那么可以在定义时加上 local 命令,此时该变量就成了局部变量。

案例

我们首先,新建一个 Shell 脚本,并输入以下代码:

name=haicoder

现在,我们在当前 Shell 中,输出该变量的值,具体命令如下:

#!/bin/bash # 定义函数 function func(){ a=99 } # 调用函数 func #输出函数内部的变量 echo $a

运行该脚本之后,终端输出如下:

18_Shell变量作用域.png

我们看到,我们在函数内部定义的变量在函数外部一样可以访问,现在,我们修改程序如下:

#!/bin/bash # 定义函数 function func(){ local a=99 } # 调用函数 func #输出函数内部的变量 echo $a

运行该脚本之后,终端输出如下:

19_Shell变量作用域.png

此时,我们看到,我们无法再在函数外部访问函数内部定义的局部变量。

Shell环境变量

说明

全局变量只在当前 Shell 会话中有效,如果使用 export 命令将它导出,那么它就在所有的子 Shell 中也有效了,这称为 “环境变量”。

环境变量被创建时所处的 Shell 被称为父 Shell,如果在父 Shell 中再创建一个 Shell,则该 Shell 被称作子 Shell。当子 Shell 产生时,它会继承父 Shell 的环境变量为自己所用,所以说环境变量可从父 Shell 传给子 Shell。不难理解,环境变量还可以传递给孙 Shell。

环境变量只能向下传递而不能向上传递,即 “传子不传父”。

此外,通过export命令导出的环境变量是临时的,关闭 Shell 会话后它就销毁了。所以,这种环境变量也只是在局部范围内起作用,并不影响所有 Shell。

如果想让环境变量在所有 Shell 中都有效,并且能够永久保存,在关闭 Shell 后也不丢失,那么就需要把环境变量写入启动文件。

变量作用域总结

在不同的作用域中,同名的变量不会相互干涉,Shell 中的变量作用域可以分为全局作用域、局部作用域和环境变量三种。