Digamos que alguém 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 referida variável, mas sem saber seu nome direto, ou seja, esperaria que algo semelhante ao seguinte funcionasse:
(( ${(P)${name}} = ${(P)${name}} + 1 )) # Set $hello to 43?
O acima não funciona - o que funcionará?
Assim como em qualquer shell do tipo Korn. Ou POSIXly:
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 ser avaliada.
é similar a
Então, em
(($name++))
(comolet "$name++"
), isso é primeiro expandido parahello++
e é avaliado como o++
operador aplicado àhello
variável.O POSIX
sh
não possui((...))
operador, mas possui o operador de expansão$((...))
aritmética . Ele não tem (embora permita que as implementações tenham um como extensão em vez de exigir que seja uma combinação de operadores unários e/ou binários ), mas tem .++
+
+=
Ao usar
: "$((...))"
where:
is o comando null, obtemos algo semelhante ao do ksh((...))
. Embora um equivalente estrito seja[ "$((...))" -ne 0 ]
, as((expression))
retorna false quando a expressão é resolvida como 0.Parece que isso vai fazer isso:
Quaisquer métodos alternativos serão muito apreciados.