Warum glaubt Bash, dass 010 8 ist?

17

Warum denkt bash, dass die Zahl 010 = 8 ist?

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

Ich dachte, es könnte binär sein, aber 010 = 10 = 2. Warum erhält es also 8, und wie kann ich es 010 = 10 (und 010 - 2 = 8) denken lassen?

Tim
quelle
15
Die Führung 0sagt, es soll oktal sein. Wenn Sie das tun nur x=10dann echo $((x+0))dann zeigen 10. Auch gibt es keine Notwendigkeit für den zusätzlichen $mit in der ().
Terrance
2
In vielen Zahlen-Parsern 010bedeutet 8, weil ein 0vorangestelltes Oktal bedeutet, ähnlich wie 0xin einigen Sprachen Hex bedeutet.
Derek 朕 朕 功夫
9
Dies ist eigentlich eine wichtige Sache, die Sie beim Programmieren wissen müssen. In den meisten Sprachen werden 0Oktal, 0xHex und 0bBinär ausgelöst.
Seth
Erklärungen ablehnen?
Tim
3
@tim warum sollte es nicht 8 sein? ;-) Oh nicht mein Downvote aber wahrscheinlich weil es zu einfach ist. Es ist ziemlich normales Verhalten.
Rinzwind,

Antworten:

42

Zahlenfolgen, die mit a beginnen, 0werden als Oktalzahlen interpretiert.
Oktal 10= dezimal 8.

Entfernen Sie die führende Null oder erzwingen Sie die Dezimalstelle mit:

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

Im Allgemeinen funktioniert das für alle Basen. Ersetzen 10Sie einfach die durch die gewünschte Basis:

N=[base#]n
Pabi
quelle
Bearbeitet die Frage mit zwei Möglichkeiten, um es zu lösen.
Pabi
1
@Zu diesem Zweck können Sie mit $ {N%?} Die letzte Ziffer
abschneiden
@ Tim, wenn ja, ich konnte nicht herausfinden, wie. $ {$ {N%?}: - 0} funktioniert in zsh, aber nicht in bash oder ksh. (Auch :-in meinem Kommentar oben hätte sein sollen :-0}
Random832
Sie sollten in Ihrer Antwort enthalten , dass Sie jede Base mit der zwingen können „ Form [base #] n, wobei Base eine Dezimalzahl zwischen 2 und 64 der arithmetischen Basis darstellt, und n eine Zahl in dieser BasisQuelle: bash ref
Dienstag,