Почему 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

Отредактировал вопрос двумя способами, чтобы решить его.
Паби

1
@ Чтобы сделать это, вы можете использовать $ {N%?}, Чтобы вырезать последнюю цифру, а затем $ {N: -}, чтобы заменить пробел на 0.
Random832

@ Если да, то я не могу понять, как. $ {$ {N%?}: - 0} работает в zsh, но не в bash или ksh. (Кроме того, :-в моем комментарии выше должно было быть :-0}
Random832

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