$(...)
é uma substituição de comando (não apenas um subshell), mas $((...))
é uma expansão aritmética.
Quando você usa $((...))
, o ...
será interpretado como uma expressão aritmética. Isso significa, entre outras coisas, que uma seqüência hexadecimal será interpretada como um número e convertida em decimal. A expressão inteira será então substituída pelo valor numérico ao qual a expressão é avaliada.
Assim como a expansão de parâmetros e a substituição de comandos, $((...))
deve ser citado para não ser afetado pela divisão de palavras do shell e globalização de nome de arquivo.
echo "$(( 0x63 ))"
Como observação, as variáveis que ocorrem em uma expressão aritmética não precisam de seu $
:
$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78