Perché bash pensa che 010 sia 8?


17

Perché bash pensa che il numero 010 = 8?

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

Ho pensato che potesse essere binario, ma 010 = 10 = 2. Quindi, perché ottiene 8, e come posso farlo pensare 010 = 10 (e 010 - 2 = 8)?


15
Il leader 0dice che è ottale. Se solo fare x=10allora echo $((x+0))poi spettacoli 10. Inoltre, non è necessario il supplemento $con in ().
Terrance

2
In molti parser numerici, 010significa 8 perché mettendo un 0davanti significa ottale, simile a come mettere 0xin alcune lingue significa esadecimale.
Derek 朕 會 功夫

9
Questa è in realtà una cosa importante da sapere durante la programmazione. Nella maggior parte delle lingue 0innesca ottale, 0xesadecimale e 0bbinario.
Seth,

Spiegazioni downvote?
Tim

3
@tim perché non dovrebbe essere 8? ;-) Oh, non il mio downvote però, ma probabilmente perché è troppo semplice. È un comportamento abbastanza normale.
Rinzwind,

Risposte:


42

Le sequenze 0numeriche che iniziano con a vengono interpretate come numeri ottali.
Ottale 10= decimale 8.

Per ottenere bash per trattarlo come un numero decimale, rimuovere lo zero iniziale o forzare il decimale con:

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

Generalmente funziona per tutte le basi, basta sostituire la 10con la base che si desidera:

N=[base#]n

Modificato la domanda in due modi per risolverlo.
Pabi,

1
@Tim per farlo puoi usare $ {N%?} Per tagliare l'ultima cifra e poi $ {N: -} per sostituire il bianco con 0.
Casuale 832

@Tim se sì non riuscivo a capire come. $ {$ {N%?}: - 0} funziona in zsh ma non in bash o ksh. (Inoltre, :-nel mio commento sopra dovrebbe essere stato :-0}
Random832

Dovresti includere nella tua risposta che puoi forzare qualsiasi base con " form [base #] n, dove base è un numero decimale tra 2 e 64 che rappresenta la base aritmetica, e n è un numero in quella base " fonte: bash ref
djeikyb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.