这让我很困惑,使用变量进行 Zsh 赋值i
% for i in '/houdi/lookup' '/komando/' ;{ echo value i = "$i" }
zsh: bad math expression: operand expected at `/houdi/loo...'
但如果改成另一个名字:
% for n in '/houdi/lookup' '/komando/' ;{ echo value i = "$n" }
value i = /houdi/lookup
value i = /komando/
有什么明确的解释吗?
谢谢
答案1
您的变量可能已被、、或中的i
任何一个声明为整数或浮点数。integer i
typeset -i i
float i
typeset -E i
typeset -F i
然后,当您尝试分配时/houdi/lookup
,shell 尝试将其解释为算术表达式并抱怨,因为第一个/
除法运算符缺少其第一个操作数。
检查:
typeset -p i
这可能会返回类似以下之一的内容:
typeset -i i=1
typeset -F i=0.0000000000
typeset -E i=1.2e+05
typeset +i i
您可以使用(或+E
相关+F
的)删除这些整数/浮点属性,并使用-g
in 函数来避免创建变量区域设置。
unset i
也会取消设置值和所有属性,因此在函数或匿名函数中声明变量为 local,例如:
(){
local i
for i (/houdi/lookup /komando/) print -r value i = $i
}
(也使用一种不太奇特的循环形式for
)。
您甚至可以$i
private
在这种情况下,本地$i
仅对匿名函数可用,甚至对其调用的函数也无效:
zmodload zsh/param/private
integer i=12
my_function() {
print 'I expect $i to be integer'
typeset -p i
}
(){
private i
for i (/houdi/lookup /komando/) {
my_function
print -r value i = $i
}
}
这使:
I expect $i to be integer
typeset -g -i i=12
value i = /houdi/lookup
I expect $i to be integer
typeset -g -i i=12
value i = /komando/
了解如何my_function
获取原始的$i
,而不是被匿名函数的 private 覆盖$i
。