O que echo $((2#$1)) faz exatamente?

O que echo $((2#$1)) faz exatamente?

O script bash a seguir exibe um número decimal quando recebe um número binário.

echo $((2#$1))

Por que exatamente?

Eu entendo que essa $1é a entrada. Talvez 2seja a base (binário). Mas não consigo entender a sintaxe usada.

Responder1

cara, festa

   echo [-neE] [arg ...]
          Output  the  args,  separated  by spaces, followed by a newline.
          The return status is 0 unless a write error occurs.   If  -n  is
          specified, the trailing newline is suppressed.  If the -e option
          is given,  interpretation  of  the  following  backslash-escaped
          characters  is  enabled.

[...]

   Arithmetic Expansion
       Arithmetic  expansion allows the evaluation of an arithmetic expression
       and the substitution of the result.  The format for  arithmetic  expan‐
       sion is:

              $((expression))

[...]

   Constants with a leading 0 are interpreted as octal numbers.  A leading
   0x or  0X  denotes  hexadecimal.   Otherwise,  numbers  take  the  form
   [base#]n,  where the optional base is a decimal number between 2 and 64
   representing the arithmetic base, and n is a number in that  base.   If
   base#  is omitted, then base 10 is used.  When specifying n, the digits
   greater than 9 are represented by the lowercase letters, the  uppercase
   letters, @, and _, in that order.  If base is less than or equal to 36,
   lowercase and uppercase letters may be used interchangeably  to  repre‐
   sent numbers between 10 and 35.

Responder2

Do documento em:https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic

Constantes com 0 à esquerda são interpretadas como números octais. Um '0x' ou '0X' inicial indica hexadecimal. Caso contrário, os números assumem a forma [base#]n, onde a base opcional é um número decimal entre 2 e 64 que representa a base aritmética e n é um número nessa base. Se base# for omitido, então a base 10 será usada. Ao especificar n, os dígitos maiores que 9 são representados pelas letras minúsculas, pelas letras maiúsculas, '@' e '_', nesta ordem. Se a base for menor ou igual a 36, ​​letras minúsculas e maiúsculas podem ser usadas alternadamente para representar números entre 10 e 35.

Então, echo $((16#FF))saídas 255e echo $((2#0110))saídas6

Responder3

A resposta de Iporé excelente, mas ligeiramente incompleto. A parte citada da página man do bash afirma que a sintaxe funciona apenas para constantes e não é uma constante. Você deveria estar se perguntando como isso[base#]n2#$1realmentefunciona!

EXPANSÃO

    A expansão é executada na linha de comando após ser dividida em palavras. Existem sete tipos de expansão realizados: expansão de chaves, expansão de til, expansão de parâmetros e variáveis, substituição de comando, expansão aritmética, divisão de palavras e expansão de nome de caminho.

    A ordem das expansões é: expansão de chaves; expansão de til, expansão de parâmetros e variáveis, expansão aritmética e substituição de comandos (feita da esquerda para a direita); divisão de palavras; e expansão do nome do caminho.

Basicamente, o Bash está fazendo a substituição da variável primeiro, para que o $1seja primeiro substituído pelo seu valor. Só então faz a expansão aritmética, que vê apenas uma constante adequada.

informação relacionada