¿Qué hace exactamente echo $((2#$1))?

¿Qué hace exactamente echo $((2#$1))?

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 $1es la entrada. Quizás 2sea 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 255y 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#]n2#$1en 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 $1primero se reemplaza con su valor. Sólo entonces hace una expansión aritmética, que sólo ve una constante propia.

información relacionada