假设我有两个函数,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
在函数内使用来明确声明为局部变量。