Bash

Bash:有沒有辦法將 bash 變數的暴露限制在它們聲明的範圍內?

  • October 25, 2022

在以下腳本中,函式 (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 變數的暴露限制在它們聲明的範圍內?

如果有人沒有明確地將它們聲明為全域變數(例如使用 declare -g),是否有辦法使變數預設為函式局部?

唯一的方法是在子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

  • 變數iinfg.

手冊(我的重點):

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

引用自:https://unix.stackexchange.com/questions/722415