Entendendo 'echo $ ((0x63))'

18

Eu estava procurando uma maneira de converter hexadecimal via linha de comando e descobri que há 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 é uma sub-casca nesta situação? Eu estou pensando não como isso significaria que o sub-shell está apenas avaliando (0x63) que não é um comando.

Alguém pode quebrar o comando para mim?

    
por Philip Kirkbride 01.11.2017 / 15:35

2 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 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
    
por 01.11.2017 / 15:38
3

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

((expression))

The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression".

    
por 01.11.2017 / 15:40

Tags