% typeset -i i
% for i in a b; print $i
0
0
Variáveis em zsh
podem ser atribuídas a vários tipos, acima de -i
para "representar internamente como um inteiro", o que fará com que a variável seja representada como tal. Isso também pode ser feito via integer i
. Existem várias maneiras de inspecionar o que é uma variável:
% print ${(t)i}
integer
% typeset -p i
typeset -i i=0
E o shell usual +
para desativar (veja também set -x
, set +x
) it:
% typeset +i i
% for i in a b; print $i
a
b
Pode ser interessante descobrir o que mudou o tipo dessa variável e restringir essa alteração a um escopo local (dentro de uma função) para que o namespace global não seja poluído com tipos aleatórios, especialmente em nomes de variáveis descartáveis usados, como como i
. É bastante fácil poluir o namespace global, pois tudo o que requer é atribuição a uma variável não declarada:
% () { local l=42; g=43 }
% print $l
% print $g
43
Ou alguém pode adicionar desnecessariamente o sinal -g
a um typeset
, o que torna a variável global:
% () { typeset -g -i h=42 }
% for h in a b; print $h
0
0
Variáveis exportadas podem persistir em novos processos (um filho não-subshell via fork
, ou uma substituição via exec
), mas não o tipo:
% 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