10.6.2 变量作用域
(1)局部变量
局部变量只在用户当前的shell生命期中有意义。如果在shell中启动另一个进程或退出,局部变量的值将无效。
当注册Shell在接受到用户输入的命令(非内部命令)后,通常会派生出一个子Shell,由此子Shell负责解释执行该命令。子Shell有自己的运行环境和变量,这些变量仅在子Shell范围内的特定环境下才能使用。可以使用set命令查看当前shell的所有局部变量。
shell的运行环境可以改变,但子shell不能存取由父shell设置的局部变量,也不能改变父shell的变量值。
例如:
$cat vartest1
echo :$x:
$x=100
$vartest1
::
上例说明在父shell中定义的局部变量,在子shell中无效。
下面再举一例说明局部变量的作用仅限于定义它的shell:
$cat vartest2
x=60
echo :$x:
$x=10
$vartest2
:60:
$echo $x
10
(2)全局变量
全局变量是一种特殊的变量,可以被任何运行的子Shell来引用。全局变量通过export命令来定义,其格式如下:
export 变量列表
一旦变量被定义为全局变量,则对于以后的所有子Shell来说这些都是全局变量。子Shell中无法改变全局变量的值;若在子Shell中改变全局变量的值,实际是对全局变量在子shell中的副本进行更改,不影响父shell中全局变量的值;子Shell中局部变量的使用优先于全局变量。
例如:
$export g_var
g _var = "GLOBAL"
$cat test_var
export g_var l_var
g_var = "sub_shell:g_var"
l_var = "sub_shell:l_var"
echo $g_var $l_var
$test_var
sub_shell:g_var sub_shell:l_var
$echo $g_var :$l_var:
GLOBAL ::
$
可以将局部变量和全局变量作用域总结如下:
(1)任何没有用export命令定义过的变量是局部变量,子Shell不能存取父Shell的局部变量。
(2)子Shell中可以存取和修改父Shell的全局变量,但这种修改对于父Shell全局变量没有任何影响。
(3)在子Shell中用export命令定义的全局变量和对此变量的修改对父Shell变量没有影响。
(4)全局变量保持它的全局性,不仅能直接传递给它的子Shell,而且子Shell还能将它传递给子Shell的子Shell。
(5)在对变量赋值之前和之后的任何时候可以将该变量转换成全局变量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。