Shell变量的作用域是Shell变量的有效作用域(可以使用的范围)。
在不同的作用域中,同名的变量不会互相干扰,就像A类有一个叫小明的朋友,B类有一个叫小明的朋友,虽然他们都叫小明(对应到变量名),因为类(对应作用域)不同javascript 局部变量 全局变量,所以不会混淆。 但如果同一个班有两个叫小明的朋友,就必须用“小明”“小明”这样的名字来区分。
Shell 变量的作用域可以分为三种类型: Shell 局部变量。 Shell也支持自定义函数,但是Shell函数与C++、Java、C#等其他编程语言函数的一个区别是,Shell函数中定义的变量也是全局变量,与在函数外部定义变量具有相同的效果。 请看下面的代码:
#!/bin/bash #定义函数 function func(){ a=99 } #调用函数 func #输出函数内部的变量 echo $a
输出结果:
99
a是在函数内部定义的,但是在函数外部也可以获取它的值,证明它的作用域是全局的,并不局限于函数内部。
如果希望变量的作用域限制在函数内,可以在定义时添加local命令,该变量就成为局部变量。 请看下面的代码:
#!/bin/bash #定义函数 function func(){ local a=99 } #调用函数 func #输出函数内部的变量 echo $a
输出结果为空,说明变量a在函数外无效,是局部变量。
Shell 变量的这一特性与 JavaScript 中的变量类似。 默认情况下,JavaScript 函数中定义的变量也是全局变量。 只要加上var关键字,它就变成了局部变量。
本节仅演示函数的定义和调用,对句子结构的细节没有过多解释。 我们将在“Shell函数”部分深入讲解。
Shell全局变量所谓全局变量是指在当前整个Shell进程中有效的变量。 每个Shell进程都有自己的作用域,互不影响。 Shell 中定义的变量默认为全局变量。
要实际演示不同 Shell 进程中全局变量的独立性,可以在图形界面中同时打开两个 Shell,或者使用两个终端远程连接服务器(SSH)。
首先打开一个Shell窗口,定义一个变量a并将形参设置为99,然后复制。 此时,在同一个Shell窗口中就可以正确复制变量a的值了。 然后打开新的Shell窗口,复制变量a的值,但结果为空,如图1所示。
图 1:打开两个 Shell 窗口
由此可见,全局变量a只在定义它的第一个Shell进程中有效,对新的Shell进程没有影响。 这个很容易理解,就像小王家和小徐家都有一台电视(变量名相同),但是小王家和小徐家的电视上播放的节目可以不同(变量值不同)。同时。
需要指出的是javascript 局部变量 全局变量,全局变量的作用范围是当前Shell进程,而不是当前Shell脚本文件。 它们是不同的概念。 打开一个Shell窗口会创建一个Shell进程,打开多个Shell窗口会创建多个Shell进程。 每个Shell进程都是独立的,有不同的进程ID。 在一个Shell进程中,可以使用source命令执行多个Shell脚本文件。 此时,全局变量在此类脚本文件中有效。
例如,有两个Shell脚本文件a.sh和b.sh。 a.sh的代码如下:
#!/bin/bash echo $a b=200
b.sh的代码如下:
#!/bin/bash echo $b
打开 Shell 窗口并输入以下命令:
[c.biancheng.net]$ a=99 [c.biancheng.net]$ . ./a.sh 99 [c.biancheng.net]$ . ./b.sh 200
这三个命令都是在一个进程中执行的。 从输出结果可以发现,Shell窗口命令行中定义的变量a在a.sh中是有效的; a.sh中定义的变量b在a.sh中有效。 它在 b.sh 中也有效。 变量b的范围已经超过了a.sh的范围。
注意,Shell脚本必须在当前进程中运行,不能在新进程中运行。 不明白的读者请前往“执行Shell脚本”。
Shell环境变量全局变量只在当前Shell进程中有效,对其他Shell进程和子进程没有影响。 如果使用export命令导入全局变量,则该变量在所有子进程中都有效。 这称为“环境变量”。
创建环境变量的Shell进程称为父进程。 如果在父进程中创建了一个新进程来执行Shell命令,那么这个新进程就称为Shell子进程。 当Shell子进程形成时,它会继承父进程的环境变量供自己使用,因此环境变量可以从父进程传递给子进程。 不难理解,环境变量也可以传递给孙子进程。
注意,两个没有父子关系的shell进程之间是不能传递环境变量的,而且环境变量只能向上传递,不能向下传递,即“传给子进程,不能传给父进程”。
创建 Shell 子进程的最简单方法是运行 bash 命令,如图 2 所示。
图2:进入Shell子流程
可以通过exit命令逐层退出Shell。
下面演示环境变量的使用:
[c.biancheng.net]$ a=22 #定义一个全局变量 [c.biancheng.net]$ echo $a #在当前Shell中输出a,成功 22 [c.biancheng.net]$ bash #进入Shell子进程 [c.biancheng.net]$ echo $a #在子进程中输出a,失败 [c.biancheng.net]$ exit #退出Shell子进程,返回上一级Shell exit [c.biancheng.net]$ export a #将a导出为环境变量 [c.biancheng.net]$ bash #重新进入Shell子进程 [c.biancheng.net]$ echo $a #在子进程中再次输出a,成功 22 [c.biancheng.net]$ exit #退出Shell子进程 exit [c.biancheng.net]$ exit #退出父进程,结束整个Shell会话
可以发现,默认情况下,a在Shell子进程中是无效的; 使用export将a导出为环境变量后,就可以在子流程中使用了。
这些export a的方法都是在定义变量a之后将其作为环境变量导入。 如果想在定义的同时作为环境变量导入,可以写export a=22。
我们仍然指出,环境变量在Shell子进程中有效,但并不意味着它在所有Shell进程中都有效; 如果通过终端创建一个新的 Shell 窗口,它不是当前 Shell 的子进程。 环境变量对于这个新的 shell 进程仍然无效。 请看右图:
第一个窗口中的环境变量a在第二个窗口中无效。 环境变量也是临时的。 通过export导出的环境变量只对当前Shell进程及所有子进程有效。 如果顶层父进程被关闭,环境变量就会急剧消失,其他进程将难以使用。 ,所以环境变量也是临时的。
有读者可能会问,如果我想让一个变量在所有Shell进程中都有效,而不管它们之间是否有父子关系,该怎么办?
只有将变量写入Shell配置文件中才能达到这个目的! Shell进程每次启动时,都会执行配置文件中的代码,做一些初始化工作。 如果在配置文件中放置一个变量,则每次启动进程时都会定义该变量。 不知道如何更改配置文件的读者请点击“加载Shell配置文件”和“编写自己的Shell配置文件”。