Como incrementar uma variável nomeada dinamicamente em 'zsh'

3

Digamos que você crie uma variável nomeada dinamicamente em zsh , assim:

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

Agora, suponha que alguém queira incrementar ou alterar a dita variável, mas sem saber seu nome direto, ou seja, eu esperaria que algo semelhante ao seguinte funcionasse:

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

O acima não funciona - o que será?

    
por nbubis 27.11.2017 / 09:11

2 respostas

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

Assim como em qualquer shell tipo Korn. Ou POSIXly:

$ name=hello
$ hello=42
$ : "$(($name += 1))"
$ echo "$hello"
43
O ponto é que todas as expansões de parâmetros, substituições de comandos e expansões aritméticas são feitas dentro de expressões aritméticas antes da expressão aritmética sendo avaliada.

((something))

é semelhante a

let "something"

Portanto, em (($name++)) (como let "$name++" ), primeiro expandido para hello++ e avaliado como o operador ++ aplicado à variável hello .

POSIX sh não possui o operador ((...)) , mas tem o operador $((...)) aritmética expansão . Ele não tem ++ (embora ele permita que as implementações tenham um como uma extensão, em vez de exigir que ele seja uma combinação de operadores unários e / ou binários + ), mas ele tem += .

Usando : "$((...))" onde : é o comando nulo, obtemos algo semelhante ao ((...)) do ksh. Embora um equivalente restrito seja [ "$((...))" -ne 0 ] , como ((expression)) retorna falso quando a expressão é resolvida como 0.

    
por 27.11.2017 / 11:43
0

Parece que isso será feito:

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

Quaisquer métodos alternativos serão muito apreciados.

    
por 27.11.2017 / 09:18

Tags