`zsh`에서 동적으로 명명된 변수를 증가시키는 방법

`zsh`에서 동적으로 명명된 변수를 증가시키는 방법

에서 동적으로 이름이 지정된 변수를 생성한다고 가정해 보겠습니다 zsh.

name="hello"
typeset $name=42
echo ${(P)${name}} # Prints the variable $hello, which is 42

이제, 해당 변수를 증가시키거나 변경하고 싶지만 해당 변수의 직접적인 이름을 알지 못한다고 가정해 보겠습니다. 즉, 다음과 유사한 내용이 작동할 것으로 예상합니다.

(( ${(P)${name}} = ${(P)${name}} + 1 )) # Set $hello to 43?

위의 방법은 작동하지 않습니다. 어떻게 될까요?

답변1

$ name=hello
$ hello=42
$ (($name++))
$ echo $hello
43

Korn과 같은 쉘과 같습니다. 또는 POSIX적으로:

$ name=hello
$ hello=42
$ : "$(($name += 1))"
$ echo "$hello"
43

요점은 모든 매개변수 확장, 명령 대체 및 산술 확장이 산술 표현식이 평가되기 전에 산술 표현식 내에서 수행된다는 것입니다.

((something))

~와 비슷하다

let "something"

따라서 (($name++))(예 let "$name++": )에서는 먼저 확장되어 변수 에 적용된 연산자 hello++로 평가됩니다 .++hello

POSIX에는 연산자가 sh없지만 산술 연산이 ((...))있습니다.$((...))확장운영자. ++(단항 및/또는 이진 연산자의 조합을 요구하는 대신 구현이 확장으로 가질 수 있도록 허용하지만 +) 는 없습니다 +=.

: "$((...))"where is null 명령을 사용하면 :ksh와 비슷한 결과를 얻을 수 있습니다 ((...)). 엄격한 동등성은 이지만 [ "$((...))" -ne 0 ], ((expression))표현식이 0으로 해석되면 as는 false를 반환합니다.

답변2

이렇게 하면 될 것 같습니다:

 typeset $name=$(( ${(P)${name}} + 1 ))

어떤 대체 방법이라도 높이 평가될 것입니다.

관련 정보