linux shell变量作用域,Shell变量的作用域:Shell全局变量、环境变量和局部变量

Shell变量的作用域(Scope),就是Shell变量的有效范围(可以使用的范围)。

在不同的作用域中,同名的变量不会相互干涉,就好像A班有个叫小明的同学,B班也有个叫小明的同学,虽然他们都叫小明(对应于变量名),但是由于所在的班级(对应于作用域)不同,所以不会造成混乱。但是如果同一个班级中有两个叫小明的同学,就必须用类似于“大小明”、“小小明”这样的命名来区分他们。

Shell变量的作用域可以分为三种:

有的变量可以在当前Shell会话中使用,这叫做全局变量(globalvariable);

有的变量只能在函数内部使用,这叫做局部变量(localvariable);

而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environmentvariable)。

全局变量

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

想要实际演示全局变量在不同Shell会话中的互不相关性,可在图形界面下同时打开两个Shell,或使用两个终端远程连接到服务器(SSH)。

首先打开一个Shell窗口,定义一个变量a并赋值为99,然后打印,这时在同一个Shell窗口中是可正确打印变量a的值的。然后再打开一个新的Shell窗口,同样打印变量a的值,但结果却为空,如图1所示。

这说明全局变量a仅仅在定义它的第一个Shell中有效,对其它Shell没有影响。这很好理解,就像小王家和小徐家都有一部电视机(变量名相同),但是同一时刻小王家和小徐家的电视中播放的节目可以是不同的(变量值不同)。

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

例如,现在有两个Shell脚本文件,分别是a.sh和b.sh。a.sh的代码如下:

#!/bin/bashecho$ab=200

b.sh的代码如下:

#!/bin/bashecho$b

打开一个Shell窗口,输入以下命令:

$a=99

$../a.sh

99

$.b.sh

200

$

从输出结果可以发现,在Shell会话中以命令行的形式定义的变量a,在a.sh中有效;在a.sh中定义的变量b,在b.sh中也有效。

局部变量

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

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

输出结果:

99

a是在函数内部定义的,但是在函数外部也可以得到它的值,证明它的作用域是全局的,而不是仅限于函数内部。

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

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

输出结果为空,表明变量a在函数外部无效,是一个局部变量。

Shell变量的这个特性和JavaScript中的变量是类似的。在JavaScript函数内部定义的变量,默认也是全局变量,只有加上var关键字,它才会变成局部变量。

环境变量

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

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

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

在一个Shell中创建子Shell最简单的方式是运行bash命令

通过exit命令可以一层一层地退出Shell。

下面演示一下环境变量的使用:

$a=22#定义一个全局变量

$echo$a  #在当前Shell中输出a,成功

22

$bash  #进入子Shell

$echo$a  #在子Shell中输出a,失败

$exit  #退出子Shell

exit

$exporta  #将a导出为环境变量

$bash  #重新进入子Shell

$echo$a  #在子Shell中再次输出a,成功

22

$exit  #退出子Shell

exit

$exit  #退出父Shell,结束整个Shell会话

可以发现,默认情况下,a在子Shell中是无效的;使用export将a导出为环境变量后,在子Shell中就可以使用了。

exporta这种形式是在定义变量a以后再将它导出为环境变量,如果想在定义的同时导出为环境变量,可以写作exporta=22。

注意,本节我们一直强调的是环境变量在子Shell中有效,并没有说它在所有的Shell种有效;如果你通过终端创建一个新的Shell,那么它就不是当前Shell的子Shell,环境变量对这个Shell就是无效的。

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

如果想让环境变量在所有Shell中都有效,并且能够永久保存,在关闭Shell后也不丢失,那么就需要把环境变量写入启动文件。至于如何写入文件,请大家自行百度,这里就不再赘述了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值