Bash:有没有办法将 bash 变量的暴露限制在它们声明的范围内?

Bash:有没有办法将 bash 变量的暴露限制在它们声明的范围内?

在以下脚本中,函数 (g) 的局部变量 (i) 的值被它调用的函数 (f) 覆盖。

#!/usr/bin/env bash

f() {
    #local i # Let's assume whoever wrote this function f forgot,
             # to declare its variables as being local to it
    i=0
}

g() {
    local i # How to declare i as being only modifiable in the
            # scope of g, but not by functions g calls?
    for i in 1 2 3; do
        f # overwrites the value of i with 0
        echo "i: $i"
    done
}

g

# output:
# i: 0
# i: 0
# i: 0

有没有办法将 bash 变量的暴露限制在它们声明的范围内?

如果有人没有明确地将变量声明为全局变量(例如使用声明-g),是否有办法使变量默认为函数局部变量?

答案1

唯一的方法是在子 shell 中运行麻烦的代码:

g() {
    local i 
    for i in 1 2 3; do
        (f)           # <<
        echo "i: $i"
    done
}
i: 1
i: 2
i: 3

变量是全局变量,除非它们被声明为局部变量。这是无法避免的。


哦,我忘记了一个非常重要的方面,local它直接影响这种情况:在中声明的“本地”变量g是可读写的g 并在任何调用自的函数中g(到任何深度)。

  • 变量iinf位于 的局部范围内g

手册(我的重点):

local只能在函数内使用;它使变量名的可见范围仅限于该函数和它的孩子


相当切题的是,Perl 的命令也有同样的“问题” local,但通过一个新命令解决了my

$ perl -e '
  sub f { $i = 10; }
  sub g { local $i = 5; f; print "$i\n"; }
  # ......^^^^^
  g
  '
10

$ perl -e '
  sub f { $i = 10; }
  sub g { my $i = 5; f; print "$i\n"; }
  # ......^^
  g
  '
5

相关内容