)%3F.png)
El siguiente script bash muestra un número decimal cuando se le proporciona un número binario.
echo $((2#$1))
¿Por qué exactamente?
Entiendo que esa $1
es la entrada. Quizás 2
sea la base (binaria). Pero no puedo entender la sintaxis utilizada.
Respuesta1
hombre golpe
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.
Respuesta2
Del doctor en:https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic
Las constantes con un 0 a la izquierda se interpretan como números octales. Un '0x' o '0X' inicial denota hexadecimal. De lo contrario, los números toman la forma [base#]n, donde la base opcional es un número decimal entre 2 y 64 que representa la base aritmética, y n es un número en esa base. Si se omite el n.º de base, se utiliza la base 10. Al especificar n, los dígitos mayores que 9 se representan mediante letras minúsculas, letras mayúsculas, '@' y '_', en ese orden. Si la base es menor o igual a 36, se pueden usar letras minúsculas y mayúsculas indistintamente para representar números entre 10 y 35.
Entonces echo $((16#FF))
salidas 255
y echo $((2#0110))
salidas6
Respuesta3
La respuesta de IporEs excelente pero muy ligeramente incompleto. La parte citada de la página de manual de bash indica que la sintaxis funciona sólo para constantes y no es una constante. Deberías preguntarte cómo esto[base#]n
2#$1
en realidad¡obras!
EXPANSIÓN
La expansión se realiza en la línea de comando después de dividirla en palabras. Se realizan siete tipos de expansión: expansión de llaves, expansión de tilde, expansión de parámetros y variables, sustitución de comandos, expansión aritmética, división de palabras y expansión de nombres de rutas.
El orden de las expansiones es: expansión de llaves; expansión de tilde, expansión de parámetros y variables, expansión aritmética y sustitución de comandos (realizada de izquierda a derecha); división de palabras; y expansión del nombre de ruta.
Básicamente, Bash realiza primero la sustitución de variables, de modo que $1
primero se reemplaza con su valor. Sólo entonces hace una expansión aritmética, que sólo ve una constante propia.