【发布时间】:2020-06-22 12:14:46
【问题描述】:
【问题讨论】:
标签: bash
【问题讨论】:
标签: bash
TL;DR 全局作用域在启动时从环境初始化,但与环境不同。
环境是父进程提供的一组<name>=<value> 形式的字符串。在启动时,shell 会获取每个 <name> 部分是有效 shell 标识符的字符串,并在全局范围内使用该名称创建一个变量。
例如,环境字符串FOO=3 变成一个名为FOO 的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 创建了一个局部变量。对该变量的更改不会影响同名的全局变量。
declare 的 -g 选项让您可以让函数内部的名称 x 引用全局范围,而不是创建局部变量。
$ foo () { declare -g x; x=3; echo "$x"; }
$ x=2
$ foo
3
$ echo "$x"
3
【讨论】: