Чому Баш думає, що 010 - це 8?


17

Чому Баш вважає число 010 = 8?

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

Я думав, що це може бути двійковим, але 010 = 10 = 2. То чому він отримує 8, і як я можу змусити його думати 010 = 10 (а 010 - 2 = 8)?


15
Ведучий 0каже, що це вісімковий. Якщо ви просто робите x=10те , echo $((x+0))то шоу 10. Крім того, немає необхідності в додатковому $в ().
Терранс

2
У багатьох парних аналізаторах 010означає 8, тому що, якщо поставити 0спереду, означає восьмерику, подібно до того, як введення 0xв деяких мовах означає шістнадцятковий.
Дерек 朕 會 功夫

9
Це насправді важлива річ, яку потрібно знати при програмуванні. У більшості мов 0спрацьовує восьмерична, 0xшістнадцяткова та 0bдвійкова.
Сет

Пояснення у відповідь?
Тім

3
@tim, чому б це не було 8? ;-) О, не мій downvote, хоча, але, мабуть, тому, що це занадто просто. Це досить нормальна поведінка.
Rinzwind

Відповіді:


42

Послідовності чисел, що починаються з a 0, інтерпретуються як восьмеричні числа.
Вісімковий 10= десятковий 8.

Щоб отримати bash, це трактує його як десяткове число, видаліть провідний нуль або силу десятки за допомогою:

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

Як правило, що працює на всіх базах, просто замініть 10потрібну базу:

N=[base#]n

Редагував питання двома способами його вирішення.
Пабі

1
@Tim для цього ви можете використовувати $ {N%?} Для подрібнення останньої цифри, а потім $ {N: -} для заміни порожнього на 0.
Random832

@ Ти, якщо так, я не міг зрозуміти, як. $ {$ {N%?}: - 0} працює в zsh, але не в bash або ksh. (Крім того , :-на мій коментар вище повинно бути :-0}
Random832

Ви повинні вказати у своїй відповіді, що ви можете змусити будь-яку базу за допомогою " форми [base #] n, де база є десятковим числом між 2 і 64, що представляє арифметичну базу, а n - число в цій базі " Джерело: bash ref
djeikyb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.