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 變數的暴露限制在它們聲明的範圍內?
如果有人沒有明確地將它們聲明為全域變數(例如使用 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
- 變數
i
inf
在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