Zsh i 命名变量; “错误的数学表达式:操作数应位于‘/houdi/loo...’”

Zsh i 命名变量; “错误的数学表达式:操作数应位于‘/houdi/loo...’”

这让我很困惑,使用变量进行 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 itypeset -i ifloat itypeset -E itypeset -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的)删除这些整数/浮点属性,并使用-gin 函数来避免创建变量区域设置。

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

相关内容