环境变量

环境变量

假设我有两个函数,foo并且bar

foo() {
  FOO=foo
}

我可以做这个:

bar() {
  echo $FOO
}

$ bar
$ foo

但我也可以这样做:

bar() {
  echo $1
}

$ bar $FOO
$ foo

foo() {
  local foo=foo
  return $foo
}

bar() {
  echo $1
}

$ bar foo
$ foo

当变量可以在不同的函数、相同的脚本或/和跨不同的脚本中使用时,如何确定变量的范围是全局的?

关于如何在 bash 中使用变量管理函数,是否有正确的方法或约定?

答案1

环境变量

当程序被调用时,它会被赋予一个称为环境的字符串数组。这是名称-值对的列表,其形式为名称=值。

Bash 提供了几种操纵环境的方法。在调用时,shell 会扫描自己的环境,并为找到的每个名称创建一个参数,自动将其标记为导出到子进程。执行的命令继承环境。导出和“declare -x”命令允许在环境中添加和删除参数和函数。如果环境中的参数值被修改,新值将成为环境的一部分,替换旧值。任何执行的命令继承的环境由 shell 的初始环境组成,其值可以在 shell 中修改,减去由 unset 和“export -n”命令删除的任何对,加上通过导出和“declare -x”命令添加的任何内容命令。

这些变量对于该环境中执行的所有脚本都是可见的

您可以通过执行命令来查看它们env

这些可以通过使用export内置或declare -x


全局变量

全局变量对单个程序(脚本)内的所有内容都可见,包括由子 shell/函数创建的子进程,但不跨程序(脚本)可见。

任何未专门导出或声明为本地的变量都将是全局变量。


局部变数

函数的局部变量可以使用局部内置变量来声明。这些变量仅对函数及其调用的命令可见。当 shell 函数调用其他函数时,这一点尤其重要。

局部变量“影子”变量与先前作用域中声明的同名变量。例如,在函数中声明的局部变量隐藏了同名的全局变量:引用和赋值引用局部变量,而全局变量保持不变。当函数返回时,全局变量再次可见。

Shell 使用动态作用域来控制变量在函数内的可见性。使用动态作用域,可见变量及其值是导致执行到达当前函数的函数调用序列的结果。函数看到的变量值取决于其在调用者(如果有)内的值,无论该调用者是“全局”作用域还是另一个 Shell 函数。这也是局部变量声明“遮蔽”的值,以及函数返回时恢复的值。

例如,如果变量 var 在函数 func1 中声明为局部变量,并且 func1 调用另一个函数 func2,则 func2 中对 var 的引用将解析为 func1 中的局部变量 var,从而遮蔽任何名为 var 的全局变量。

这些变量仅对声明它们的函数和任何子函数可见。

这些变量必须通过使用local内置变量或简单地declare在函数内使用来明确声明为局部变量。

相关内容