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/

익명 함수의 private 에 의해 재정의되는 대신 my_function원본을 얻는 방법을 알아보세요 .$i$i

관련 정보