내 변수의 값은 0이지만 0으로 설정하지 않았습니다.

내 변수의 값은 0이지만 0으로 설정하지 않았습니다.

오늘 나는 내 zsh 기능 중 하나가 작동하지 않는 것을 발견했습니다. 문제를 조사한 결과 범인은 다음과 같습니다.

for i in a b
do
echo "$i"
done
0
0

그런 다음 새 zsh를 열면 모든 것이 잘 작동합니다.

for i in a b
do
echo "$i"
done
a
b

첫 번째 사람이 나에게 이상하게 행동하는 이유를 설명할 수 있는 사람이 있나요?

답변1

% typeset -i i
% for i in a b; print $i
0
0

의 변수에는 zsh위의 -i"내부적으로 정수로 표시되는" 다양한 유형이 할당될 수 있으며, 이로 인해 변수가 정수로 표시됩니다. 이는 를 통해서도 수행할 수 있습니다 integer i. 변수가 무엇인지 확인하는 방법에는 여러 가지가 있습니다.

% print ${(t)i}
integer
% typeset -p i
typeset -i i=0

+그리고 이를 비활성화하는 공통 쉘(도 참조 set -x) set +x:

% typeset +i i
% for i in a b; print $i
a
b

특히 자주 사용되는 일회용 변수 이름에서 전역 네임스페이스가 무작위 유형으로 오염되지 않도록 해당 변수의 유형을 변경하는 내용을 찾아 함수 내에서 로컬 범위로 제한하는 것이 도움이 될 수 있습니다. i선언되지 않은 변수에 할당하면 되기 때문에 전역 네임스페이스를 오염시키는 것은 매우 쉽습니다.

% () { local l=42; g=43 }
% print $l

% print $g
43

또는 누군가 변수를 전역 변수 -g로 만들기 위해 불필요하게 플래그를 추가 할 수도 있습니다 typeset.

% () { typeset -g -i h=42 }
% for h in a b; print $h
0
0

내보낸 변수는 새 프로세스( 를 통한 비-하위 쉘 하위 프로세스 fork또는 를 통한 대체 exec)에 지속될 수 있지만 유형은 다음을 수행하지 않습니다.

% export -i h=42
% print $h ${(t)h}
42 integer-export

% ( print ${(t)h} )
integer-export

% exec zsh -l
% print $h ${(t)h}
42 scalar-export

관련 정보