Entendendo `echo $ ((0x63))`

18

Eu estava procurando uma maneira de converter hexadecimal via linha de comando e descobri que existe um método muito fácil echo $((0x63)).

Está funcionando muito bem, mas estou um pouco confuso sobre o que está acontecendo aqui.

Eu sei que $(...)normalmente é um sub-shell, onde o conteúdo é avaliado antes do comando externo.

Ainda é um sub-shell nessa situação? Estou pensando que não, isso significaria que o sub-shell está apenas avaliando o (0x63)que não é um comando.

Alguém pode quebrar o comando para mim?

Philip Kirkbride
fonte

Respostas:

27

$(...)é 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 sequência hexadecimal será interpretada como um número e convertida em decimal. A expressão inteira será substituída pelo valor numérico que a expressão avalia.

Como expansão de parâmetro e substituição de comando, $((...))deve ser citado para não ser afetado pela divisão da palavra do shell e pelo globbing do nome do arquivo.

echo "$(( 0x63 ))"

Como observação lateral, as variáveis ​​que ocorrem em uma expressão aritmética não precisam de $:

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78
Kusalananda
fonte
2
Observe também que, devido a $((...))conflitos com a substituição de comandos, é preciso lembrar de escrever em echo "$( (echo x; echo y) | tr xy yx)"vez de echo "$((echo x; echo y) | tr xy yx)"(mesmo que alguns shells ainda aceitem o último, YMMV).
Stéphane Chazelas 1/11
@ StéphaneChazelas E como você $(( ))produz resultados afetados pela divisão de palavras ou globbing?
Hauke ​​Laging
3
@HaukeLaging IFS=9; echo $((0x63)),. Ver também implicações de segurança de esquecer de citar uma variável em bash / shells POSIX ( What about [ $# -gt 1 ]seção)
Stéphane Chazelas
3

Esta não é uma subcamada, mas uma avaliação aritmética. De man bash:

((expressão))

A expressão é avaliada de acordo com as regras descritas abaixo em AVALIAÇÃO ARITMÉTICA . Se o valor da expressão for diferente de zero, o status de retorno será 0; caso contrário, o status de retorno é 1. Isso é exatamente equivalente a deixar "expressão".

user4556274
fonte
9
((...))não é exatamente o mesmo que $((...)). Ambos fazem avaliação aritmética, mas o último é substituído pelo valor resultante como uma sequência.
Kusalananda