¿Por qué bash piensa que 010 es 8?


17

¿Por qué bash piensa que el número 010 = 8?

x=010
echo $x
  010
echo $(( x+0 ))
  8
echo $(( x-2 ))
  6

Pensé que podría ser binario, pero 010 = 10 = 2. Entonces, ¿por qué obtiene 8 y cómo puedo hacer que piense 010 = 10 (y 010 - 2 = 8)?


15
La guía 0le dice que sea octal. Si solo lo haces, x=10entonces echo $((x+0))se muestra 10. Además, no es necesario el extra $con ().
Terrance

2
En muchos analizadores numéricos, 010significa 8 porque al poner un 0frente significa octal, similar a cómo poner 0xen algunos idiomas significa hexadecimal.
Derek 朕 會 功夫

9
Esto es realmente algo importante para saber cuando se programa. En la mayoría de los idiomas se 0activan octal, 0xhexadecimal y 0bbinario.
Septiembre

¿Explicaciones de voto negativo?
Tim

3
@tim ¿por qué no sería 8? ;-) Sin embargo, no es mi voto negativo, pero probablemente porque es demasiado básico. Es un comportamiento bastante normal.
Rinzwind

Respuestas:


42

Las secuencias numéricas que comienzan con a 0se interpretan como números octales.
Octal 10= decimal 8.

Para que bash lo trate como un número decimal, elimine el cero inicial o fuerce el decimal con:

N=010
N=$((10#$N))

En general, eso funciona para todas las bases, simplemente reemplace la 10con la base que desee:

N=[base#]n

Editó la pregunta con dos formas de resolverla.
Pabi

1
@Tim para hacerlo, puede usar $ {N%?} Para cortar el último dígito y luego $ {N: -} para reemplazar el espacio en blanco con 0.
Random832

@Tim si es así, no podría entender cómo. $ {$ {N%?}: - 0} funciona en zsh pero no en bash o ksh. (Además, :-en mi comentario anterior debería haber sido :-0}
Random832

Debe incluir en su respuesta que puede forzar cualquier base con la " forma [base #] n, donde base es un número decimal entre 2 y 64 que representa la base aritmética, yn es un número en esa base " fuente: ref bash
djeikyb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.