Почему Bash считает, что 010 это 8?

17

Почему Bash считает число 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двоичные.
Сет
Объяснения Downvote?
Тим
3
@ Почему бы не быть 8? ;-) О, не мое понижение, хотя, но, вероятно, потому что это слишком простой. Это довольно нормальное поведение.
Rinzwind

Ответы:

42

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

Чтобы заставить bash рассматривать его как десятичное число, удалите начальный ноль или принудительное десятичное число с помощью:

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

Как правило, это работает для всех баз, просто замените 10на базу, которую вы хотите:

N=[base#]n
Pabi
источник
Отредактировал вопрос двумя способами, чтобы решить его.
Паби
1
@ Чтобы сделать это, вы можете использовать $ {N%?}, Чтобы вырезать последнюю цифру, а затем $ {N: -}, чтобы заменить пробел на 0.
Random832
@ Если да, то я не могу понять, как. $ {$ {N%?}: - 0} работает в zsh, но не в bash или ksh. (Кроме того, :-в моем комментарии выше должно было быть :-0}
Random832
Вы должны включить в свой ответ, что вы можете использовать любое основание с помощью « form [base #] n, где base - это десятичное число от 2 до 64, представляющее арифметическую базу, а n - это число в этой базе ». Source: bash ref
djeikyb