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