【问题标题】:Local variable scope when one function calls another inside bash shell当一个函数在 bash shell 中调用另一个函数时的局部变量范围
【发布时间】:2016-07-30 17:10:19
【问题描述】:
# ! /bin/sh

function pqr()
{
  # This prints value to 10 even though variable is local inside a
  echo "Displaying value of var a $a"  
}
function abc()
{
local a=10
# call function pqr and don't pass value of a
pqr
}

即使我没有将变量 a 传递给 pqr() 函数,我在 pqr() 中得到 a=10。我的问题是 pqr() 中 a 的范围和可见性与 abc() 的范围和可见性相同吗?这是因为我们从函数 abc() 调用 pqr() 吗?我期待新变量会在 pqr 中创建并显示空白值。(因为这是变量范围和可见性在现代语言中的工作方式,所以我很好奇这在 bash 中是如何工作的) 我明白在上面的例子中,如果我在 pqr() 内部重新声明,那么新变量将被创建并因此显示空白值。提前谢谢!!!

【问题讨论】:

  • "这是因为我们从函数 abc() 调用 pqr() 吗?" - 是的:-)
  • local 的手册中提到“它使变量 NAME 具有仅限于该函数及其子函数的可见范围。”
  • 大多数现代语言都是词法范围的。但是,bash 是动态范围的。

标签: bash function shell


【解决方案1】:

如 cmets 中所述(来自man bash):

在函数中使用local 时,它会导致变量名的可见范围仅限于该函数及其子函数。

所以从abc 内部调用pqr 意味着变量$a 在两个函数中都是可见的。

值得一提的是,由于您使用的是特定于 bash 的功能,例如 local 和不可移植的 function 语法,因此您应该将 shebang 更改为 #!/bin/bash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多