TL; DR全局作用域是在启动时从环境初始化的,但与环境不同。
环境是一组<name>=<value>
由父进程提供的形式的字符串。启动时,外壳程序将使用其<name>
部分为有效外壳程序标识符的每个字符串,并使用该名称在全局范围内创建一个变量。
例如,环境字符串FOO=3
将成为名为FOO
value的shell变量3
。
另一方面,10=6
shell会忽略环境字符串,因为10
它不是有效的shell标识符。但是,该字符串保留在环境中,然后传递给任何可能期望使用此字符串的子进程。[更新:POSIX规范不要求忽略此类字符串;合格的外壳可以保留或丢弃它们。]
还有一些局部变量,它们是由诸如local
和declare
函数定义之类的命令创建的。例如:
$ foo () { declare x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
2
x=2
在全局范围内创建(或更改其值)变量。在函数内部,declare x
创建了一个局部变量。对该变量所做的更改不会影响具有相同名称的全局变量。
使用该-g
选项declare
可以使x
函数内部的名称引用全局范围,而不是创建局部变量。
$ foo () { declare -g x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
3
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句