Zsh変数名を指定しました。 "無効な数学式:オペランドは '/houdi/loo...'になければなりません。"

Zsh変数名を指定しました。 "無効な数学式:オペランドは '/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シェルはそれを算術式として解釈しようとし、最初の除算/演算子に最初のオペランドがないため文句を言います。

調べる:

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 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$i

関連情報