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

유일한 방법은 서브셸에서 문제가 있는 코드를 실행하는 것입니다.

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의 변수 는 f의 로컬 범위에 있습니다 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

관련 정보