다음과 같이 동적으로 명명된 변수를 생성한다고 가정합니다 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 ))
어떤 대안이라도 대단히 감사하겠습니다.