foo
두 가지 기능 이 있다고 가정 해 봅시다 bar
.
foo() {
FOO=foo
}
나는 이것을 할 수 있다:
bar() {
echo $FOO
}
$ bar
$ foo
하지만 이렇게 할 수도 있습니다.
bar() {
echo $1
}
$ bar $FOO
$ foo
그리고
foo() {
local foo=foo
return $foo
}
bar() {
echo $1
}
$ bar foo
$ foo
변수가 다른 함수, 동일한 스크립트 또는/또는 다른 스크립트에서 사용될 수 있는 경우 변수의 범위가 전역인지 어떻게 판단합니까?
Bash에서 변수 관리 기능을 사용하는 방법에 대한 올바른 방법이나 규칙이 있습니까?
답변1
환경 변수
프로그램이 호출되면 환경이라는 문자열 배열이 제공됩니다. 이는 이름=값 형식의 이름-값 쌍 목록입니다.
Bash는 환경을 조작하는 여러 가지 방법을 제공합니다. 호출되면 쉘은 환경을 스캔하고 발견된 각 이름에 대한 인수를 생성하여 자동으로 하위 프로세스로 내보낼 수 있도록 표시합니다. 실행된 명령은 환경을 상속합니다. 내보내기 및 "declare -x" 명령을 사용하면 매개변수와 기능을 환경에 추가하고 제거할 수 있습니다. 환경의 매개변수 값이 수정되면 새 값이 환경의 일부가 되어 이전 값을 대체합니다. 실행된 명령에 의해 상속된 환경은 셸에서 값을 수정할 수 있는 셸의 초기 환경에서 unset 및 "export -n" 명령으로 제거된 모든 쌍을 빼고, 내보내기 및 "declare -x로 추가된 값"으로 구성됩니다. "는 모든 콘텐츠 명령을 명령합니다.
이러한 변수는 이 환경에서 실행되는 모든 스크립트에 표시됩니다.
명령을 실행하여 볼 수 있습니다 env
.
export
내장된 또는declare -x
전역 변수
전역 변수는 서브쉘/함수에 의해 생성된 하위 프로세스를 포함하여 단일 프로그램(스크립트) 내의 모든 항목에 표시되지만 프로그램(스크립트) 전체에서는 표시되지 않습니다.
특별히 내보내거나 로컬로 선언하지 않은 모든 변수는 전역 변수가 됩니다.
지역 변수
함수의 지역 변수는 지역 내장 변수를 사용하여 선언할 수 있습니다. 이러한 변수는 함수와 함수가 호출하는 명령에만 표시됩니다. 이는 쉘 함수가 다른 함수를 호출할 때 특히 중요합니다.
지역 변수는 이전 범위에서 선언된 변수와 동일한 이름을 가진 변수를 "그림자"로 만듭니다. 예를 들어, 함수 내에서 선언된 지역 변수는 동일한 이름의 전역 변수를 숨깁니다. 참조 및 할당은 지역 변수를 참조하지만 전역 변수는 변경되지 않습니다. 함수가 반환되면 전역 변수가 다시 표시됩니다.
Shell은 동적 범위 지정을 사용하여 함수 내 변수의 가시성을 제어합니다. 동적 범위 지정을 사용하면 표시되는 변수와 해당 값은 현재 함수에 도달하도록 실행을 이끈 일련의 함수 호출의 결과입니다. 함수에 표시되는 변수의 값은 호출자가 "전역" 범위인지 또는 다른 셸 함수인지 여부에 따라 호출자(있는 경우) 내의 값에 따라 달라집니다. 이는 지역 변수 선언에 의해 "숨겨진" 값이기도 하며 함수가 반환될 때 복원되는 값이기도 합니다.
예를 들어, var 변수가 func1 함수에서 지역 변수로 선언되고 func1이 다른 함수 func2를 호출하는 경우 func2의 var에 대한 참조는 func1의 지역 변수 var로 확인되어 var라는 전역 변수를 숨깁니다.
이러한 변수는 해당 변수가 선언된 함수와 모든 하위 함수에만 표시됩니다.
local
이러한 변수는 내장 변수를 사용 하거나 단순히 declare
함수 내에서 사용하여 지역 변수로 명시적으로 선언해야 합니다.