Чому баш думає: 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повністю використовується в баші, щоб отримати провідний нуль для імен файлів і подібних.
Squeezy

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

8
Зауважте, що ви могли самі це зрозуміти, роблячи цеecho $((016))
Мехрдад

2
FYI, це справедливо для багатьох мов програмування: C, C ++, Javascript.
Пол Дрейпер

Відповіді:


128

Нерозуміння полягає в тому, що цифри не означають того, що ви очікуєте.

Провідний нуль позначає число з базою 8. Тобто 016це те саме, що 8#16. Якщо ви хочете зберегти первинний нуль, тоді вам потрібно 10#016.

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

23
У світі існує 10 типів людей. Тих, хто розуміє бінарне, тих, хто цього не робить, тих, хто не очікував базу 8 жартів, та 5 інших людей.
Історія про Джон

42

Оскільки:

~$ echo $((NUM))
14

якщо число починається з 0, воно вважається вісімковим значенням, а 16 в восьмеричному - 14 в десяткових.


2
Це чудово дає сенс і пояснює, чому мій сценарій перезаписував мої старі файли :-(
DeltaLima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.