我的变量的值为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

+以及禁用它的常用 shell (另请参阅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标志添加到 a 中typeset,使变量成为全局变量:

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

导出的变量可能会保留到新进程中(非子 shell 子进程 viafork或替换 via 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

相关内容