Por que o bash pensa que 010 é 8?

17

Por que o bash acha que o número 010 = 8?

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

Eu pensei que poderia ser binário, mas 010 = 10 = 2. Então, por que ele obtém 8 e como posso fazê-lo pensar 010 = 10 (e 010 - 2 = 8)?

Tim
fonte
15
O líder 0diz que é octal. Se você apenas faz x=10, echo $((x+0))então mostra 10. Além disso, não há necessidade de extra $com o ().
Terrance
2
Em muitos analisadores de números, 010significa 8 porque colocar um 0na frente significa octal, semelhante a como colocar 0xem alguns idiomas significa hex.
Derek #
9
Isso é realmente uma coisa importante a saber ao programar. Na maioria dos idiomas, 0aciona octal, 0xhex e 0bbinário.
Seth
Explicações de voto negativo?
Tim
3
@tim por que não seria 8? ;-) Oh, não meu voto negativo, mas provavelmente porque é muito básico. É um comportamento bastante normal.
Rinzwind

Respostas:

42

As seqüências numéricas iniciadas com a 0são interpretadas como números octais.
Octal 10= decimal 8.

Para que o bash o trate como um número decimal, remova o zero inicial ou force o decimal com:

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

Geralmente isso funciona para todas as bases, basta substituir o 10pela base que você deseja:

N=[base#]n
Pabi
fonte
Editou a pergunta com duas maneiras de resolvê-la.
Pabi
1
@ Tim para fazer isso você pode usar $ cortar o último dígito e, em seguida, $ {N: -} {N%?} Para substituir branco com 0.
Random832
@ Tim, se não, eu não conseguia descobrir como. $ {$ {N%?}: - 0} funciona no zsh, mas não no bash ou no ksh. (Além disso, :-no meu comentário acima deveria ter sido :-0})
Random832
Você deve incluir em sua resposta que pode forçar qualquer base com o " formulário [base #] n, onde base é um número decimal entre 2 e 64 representando a base aritmética e n é um número nessa base " source: bash ref
djeikyb