"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 ]표현식이 0으로 확인되면 as는 false를 반환합니다.((expression))

답변2

이것이 트릭을 수행할 것 같습니다:

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

어떤 대안이라도 대단히 감사하겠습니다.

관련 정보