Warum denkt bash: 016 + 1 = 15?

60

Kann mir jemand erklären, warum eine Zahl mit einer führenden 0 dieses lustige Verhalten hervorruft?

#!/bin/bash
NUM=016 
SUM=$((NUM + 1)) 
echo "$NUM + 1 = $SUM"

Druckt:

016 + 1 = 15

DeltaLima
quelle
3
Psst: printf "%03d\n" 10ist in bash vollständig verwendbar, um eine führende Null für Dateinamen und dergleichen zu erhalten.
Squeezy
@Squeezy Danke, aber dieser Teil hat bereits funktioniert. Das eigentliche Problem bestand darin, keinen Dateinamen mit einer führenden 0 zu erhalten. Es wurde herausgefunden, welcher Dateiname die höchste Nummer hat, und dann die nächste in Folge mit printf "prefix-% 03d.tif" $ SUM erstellt.
DeltaLima
8
Beachten Sie, dass Sie dies selbst herausgefunden haben könnten, indem Sieecho $((016))
Mehrdad
2
Zu Ihrer Information, dies gilt für viele Programmiersprachen: C, C ++, Javascript.
Paul Draper

Antworten:

128

Das Missverständnis ist, dass die Zahlen nicht bedeuten, was Sie erwarten.

Eine führende Null bezeichnet eine Zahl mit der Basis 8. Dh 016ist dasselbe wie 8#16. Wenn Sie die führende Null behalten möchten, müssen Sie 10#016.

> num=016
> echo $((num))
14
> echo $((10#$num))
16
Hauke ​​Laging
quelle
23
Es gibt 10 Arten von Menschen auf der Welt. Diejenigen, die das Binäre verstehen, die, die es nicht verstehen, die, die keinen Base-8-Witz erwartet haben, und 5 andere Arten von Leuten.
Jon Story
42

Weil:

~$ echo $((NUM))
14

Wenn die Zahl mit 0 beginnt, wird sie als Oktalwert betrachtet und 16 in Oktal ist 14 in Dezimalzahl.

fredtantini
quelle
2
Das ist absolut
sinnvoll