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


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

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.


2
Das ist absolut
sinnvoll
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.