Почему Баш думает: 016 + 1 = 15?


60

Может кто-нибудь объяснить мне, почему число с ведущим 0 дает такое забавное поведение?

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

Распечатает:

016 + 1 = 15


3
Psst: printf "%03d\n" 10полностью используется в bash для получения начального нуля для имен файлов и тому подобного.
Squeezy

@ Squeezy Спасибо, но эта часть уже работала. Фактическая проблема не заключалась в получении имени файла с начальным 0. Он выяснил, какое имя файла имело наибольшее число, а затем создал следующий в последовательности, используя printf "prefix-% 03d.tif" $ SUM.
DeltaLima

8
Обратите внимание, что вы могли бы выяснить это сами, выполнивecho $((016))
Мехрдад

2
К вашему сведению, это верно для многих языков программирования: C, C ++, Javascript.
Пол Дрэйпер

Ответы:


128

Недоразумение в том, что цифры не означают, что вы ожидаете.

Ведущий ноль обозначает число с основанием 8. То 016есть то же самое, что и 8#16. Если вы хотите сохранить ведущий ноль, то вам нужно 10#016.

> num=016
> echo $((num))
14
> echo $((10#$num))
16

23
В мире 10 типов людей. Те, кто понимает двоичный код, те, кто не понимают, те, кто не ожидал шутку с базовыми данными, и 5 других типов людей.
Джон Стори

42

Потому что:

~$ echo $((NUM))
14

если число начинается с 0, оно считается восьмеричным, а 16 в восьмеричном - 14 в десятичном.


2
Это прекрасно понимает и объясняет, почему мой скрипт перезаписывал мои старые файлы :-(
DeltaLima
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.