에서 동적으로 이름이 지정된 변수를 생성한다고 가정해 보겠습니다 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 ))
어떤 대체 방법이라도 높이 평가될 것입니다.