전역 & 지역 변수 할당

온라인 자습서를 통해 셸 스크립팅을 배우는 중이며 다음 스크립트에 도달했습니다. 전역 및 지역 변수의 차이를 선언합니다.

#!/bin/bash # Experimenting with variable scope var_change () { local var1="local 1" echo Inside function: var1 is $var1 : var2 is $var2 var1="changed again" var2="changed again" } var1="global 1" var2="global 2" echo Before function call: var1 is $var1 : var2 is $var2 var_change echo After function call: var1 is $var1 : var2 is $var2 

출력은 다음과 같습니다.

함수 호출 전 : var1은 global 1 : var2는 global입니다. 2

내부 함수 : var1은 로컬 1 : var2는 global 2

함수 호출 후 : var1은 글로벌 1 : var2가 다시 변경됨

내 질문 …

var1 이후 " 대신 " global 1 " 함수 호출이 다시 변경됨 "? 누군가 설명 할 수 있습니까?

Answer

var1는 함수에서 로컬로 선언됩니다. 따라서 함수를 실행하는 동안 var1라는 이름의 변수가 있습니다. 전역 변수와 로컬 변수입니다. 그러나 함수는 로컬 함수 만 “볼”수 있습니다 (로컬 함수는 전역 함수를 “그림자”). 따라서 함수 내에서 var1에 수행하는 모든 작업은 지역 변수에 수행됩니다. 글로벌 var1는 전혀 건드리지 않습니다.

답변

local var1="local 1"var1의 현재 값을 저장하는 효과가 있다고 상상하고 복원 될 기능을 "local 1"로 설정합니다. 이 멘탈 모델을 사용하면 모든 변수를 전역으로 생각할 수 있고 변수는 함수의 끝에서 복원 할 수 있습니다.

함수 내부와 외부에서 모두 echo를 호출하는 대신 예제가 더 좋았을 것입니다. var를 출력 한 다른 함수를 호출했습니다.

bash$ show(){ printf " The value of %s in %s is "%s"\n" $1 $2 ${!1} ; } bash$ bar(){ show v1 bar_$1 ; } bash$ foo(){ show v1 before_foo ; local v1 ; show v1 after_local ; \ v1="changed"; show v1 after_change ; bar via_foo ; } bash$ v1="global" bash$ show v1 global_scope The value of v1 in global_scope is "global" bash$ foo The value of v1 in before_foo is "global" The value of v1 in after_local is "" The value of v1 in after_change is "changed" The value of v1 in bar_via_foo is "changed" bash$ bar direct The value of v1 in bar_direct is "global" bash$ show v1 global_scope The value of v1 in global_scope is "global" 

여기에서 foo 내부에서 bar에 대한 호출에서 foo가 설정 한 v1의 값을 선택하는 것을 볼 수 있습니다.

dynamic scopelexical scope에 대한 웹 검색이 도움이 될 수 있습니다.

댓글

  • " 기능이 종료되면 복원됩니다 ", 이것은 내 마음을 명확하게합니다! 감사합니다

답변

Bash에서 지역 변수는 명시 적으로 호출해야합니다. 그렇지 않으면 전역 변수로 처리됩니다. . 함수 내부에서도 (범위가 적용되는 위치 임)

그리고 변수에 마지막으로 설정된 범위가 무엇이든간에, local 또는 생략을 통한 전역-echo를 통해 호출 될 때 반환됩니다.

예를 들어, 함수가 호출 된 후 로컬 범위는 var1에 설정되므로이 변수에 대한 변경 사항은 함수 외부에서 유지되지 않습니다. 하지만 전역은 var2에 설정되어 있으므로이 변수를 변경하면됩니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다