$ 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.