Shell 变量的做用域(Scope),就是 Shell 变量的有效范围(可使用的范围)。
在不一样的做用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同窗,B 班也有个叫小明的同窗,虽然他们都叫小明(对应于变量名),可是因为所在的班级(对应于做用域)不一样,因此不会形成混乱。可是若是同一个班级中有两个叫小明的同窗,就必须用相似于“大小明”、“小小明”这样的命名来区分他们。
Shell 变量的做用域能够分为三种:java
所谓全局变量,就是指变量在当前的整个 Shell 会话中都有效。每一个 Shell 会话都有本身的做用域,彼此之间互不影响。在 Shell 中定义的变量,默认就是全局变量。
想要实际演示全局变量在不一样 Shell 会话中的互不相关性,可在图形界面下同时打开两个 Shell,或使用两个终端远程链接到服务器(SSH)。
首先打开一个 Shell 窗口,定义一个变量 a 并赋值为 1,而后打印,这时在同一个 Shell 窗口中是可正确打印变量 a 的值的。而后再打开一个新的 Shell 窗口,一样打印变量 a 的值,但结果却为空,如图 1 所示。
shell
图1:打开两个 Shell 会话编程
这说明全局变量 a 仅仅在定义它的第一个 Shell 中有效,对其它 Shell 没有影响。这很好理解,就像小王家和小徐家都有一部电视机(变量名相同),可是同一时刻小王家和小徐家的电视中播放的节目能够是不一样的(变量值不一样)。
须要强调的是,全局变量的做用范围是当前的 Shell 会话,而不是当前的 Shell 脚本文件,它们是不一样的概念。打开一个 Shell 窗口就建立了一个 Shell 会话,打开多个 Shell 窗口就建立了多个 Shell 会话,每一个 Shell 会话都是独立的进程,拥有不一样的进程 ID。在一个 Shell 会话中,能够执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。
例如,如今有两个 Shell 脚本文件,分别是 a.sh 和 b.sh。a.sh 的代码以下:bash
b.sh 的代码以下:服务器
打开一个 Shell 窗口,输入如下命令:编程语言
从输出结果能够发现,在 Shell 会话中以命令行的形式定义的变量 a,在 a.sh 中有效;在 a.sh 中定义的变量 b,在 b.sh 中也有效。函数
Shell 也支持自定义函数,可是 Shell 函数和 C/C++、Java 等其余编程语言函数的一个不一样点就是:在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有同样的效果。请看下面的代码:spa
输出结果:
99
a 是在函数内部定义的,可是在函数外部也能够获得它的值,证实它的做用域是全局的,而不是仅限于函数内部。
要想变量的做用域仅限于函数内部,那么能够在定义时加上local
命令,此时该变量就成了局部变量。请看下面的代码:.net
输出结果为空,代表变量 a 在函数外部无效,是一个局部变量。
Shell 变量的这个特性和 JavaScript 中的变量是相似的。在 JavaScript 函数内部定义的变量,默认也是全局变量,只有加上var
关键字,它才会变成局部变量。命令行
全局变量只在当前 Shell 会话中有效,若是使用export
命令将它导出,那么它就在全部的子 Shell 中也有效了,这称为“环境变量”。
环境变量被建立时所处的 Shell 被称为父 Shell,若是在父 Shell 中再建立一个 Shell,则该 Shell 被称做子 Shell。当子 Shell 产生时,它会继承父 Shell 的环境变量为本身所用,因此说环境变量可从父 Shell 传给子 Shell。不难理解,环境变量还能够传递给孙 Shell。
注意,环境变量只能向下传递而不能向上传递,即“传子不传父”。
在一个 Shell 中建立子 Shell 最简单的方式是运行 bash 命令,如图 2 所示。
图2:进入子 Shell
经过exit
命令能够一层一层地退出 Shell。
下面演示一下环境变量的使用:
能够发现,默认状况下,a 在子 Shell 中是无效的;使用 export 将 a 导出为环境变量后,在子 Shell 中就可使用了。export a
这种形式是在定义变量 a 之后再将它导出为环境变量,若是想在定义的同时导出为环境变量,能够写做export a=22
。
注意,本节咱们一直强调的是环境变量在子 Shell 中有效,并无说它在全部的 Shell 种有效;若是你经过终端建立一个新的 Shell,那么它就不是当前 Shell 的子 Shell,环境变量对这个 Shell 就是无效的。
此外,经过export
命令导出的环境变量是临时的,关闭 Shell 会话后它就销毁了。因此,这种环境变量也只是在局部范围内起做用,并不影响全部 Shell。若是想让环境变量在全部 Shell 中都有效,而且可以永久保存,在关闭 Shell 后也不丢失,那么就须要把环境变量写入启动文件。至于如何写入文件,请你们自行百度,这里就再也不赘述了。