)%20faz%20exatamente%3F.png)
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 2
seja 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 255
e 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#]n
2#$1
realmentefunciona!
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 $1
seja primeiro substituído pelo seu valor. Só então faz a expansão aritmética, que vê apenas uma constante adequada.