의 unset
에 대한 다음 부분을 이해하려고합니다. div> https://unix.stackexchange.com/a/381782/674
unset
bash
현재 범위에서 선언 된 경우에만 변수 설정을 해제합니다. ( 전역 범위를 제외하고 선언 된 상태로 둡니다 . 속성과 값을 제거하고 변수가 더 이상 배열이나 해시가 아닙니다. namerefs에서는 참조 된 변수를 설정 해제합니다.) 그렇지 않으면 위에서 언급 한 스택에서 하나의 변수 레이어 만 표시됩니다.
Bash 매뉴얼은 “관련된 내용을 언급하지 않거나 그리워합니다.
예시를 들어 설명해 주시겠습니까?
- “는 다음과 같은 경우에만 변수 설정을 해제합니다. 현재 범위에서 선언되었습니다. “
-
“전역 범위를 제외하고 선언 된 상태를 유지합니다. “
If
unset
함수의 로컬 범위에있는 변수는unset
변수가 설정되지 않았을뿐만 아니라 선언되지 않았습니까?전역 범위에있는 변수입니다.
unset
변수가 설정되지 않았지만 여전히 선언되어 있습니까?변수가 다음과 같은지 어떻게 확인할 수 있습니까? 선언 여부?
-
“그렇지 않으면 위에서 언급 한 스택에서 하나의 변수 레이어 만 팝니다.”
otherwise와 one variable layer는 무엇을 의미합니까?
감사합니다.
답변
예 :
p>
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
동일한 범위에서 선언 된 변수에서 호출 된 unset
입니다. 제대로 설정되지 않았습니다. 속성과 값을 잃었지만 여전히 선언되어 있지만 여전히 해당 범위로 제한됩니다. a=2
를 수행하더라도 f
<에 로컬 인 a
에서 여전히 수행됩니다. / div>, 외부 범위의 항목은 영향을받지 않습니다. 좋습니다.
In :
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
unset a
는 a
를 설정 해제하지 않았습니다. 대신, 그것은 아래에있는 하나, 외부 범위에있는 하나를 드러 냈습니다. g
가 반환되면 f
“의 a
변수가 더 이상 로컬이 아닙니다.
p>
bash 5 이상에서는 localvar_unset
옵션을 설정하여 수정할 수 있습니다.
mksh
및 yash
여기서 unset
는 설정 해제 대신 팝핑 을 수행합니다. 동일한 범위에서 선언 된 변수의 경우에도 마찬가지입니다. 첫 번째 예는 다음과 같습니다.
typeset a=0 2
추가 정보 :