KornShell: переменная, присвоенная «000010», преобразована в 8 вместо 10. - PullRequest
0 голосов
/ 07 июля 2010

У меня есть строка фиксированной длины, которая является числом.Когда я присваиваю строку переменной, ей присваивается 8 вместо 10. Почему?Как мне это остановить?

$ i=10
$ ((i=i+1))
$ echo $i
11    # Right answer
$ i=000010
$ ((i=i+1))
$ echo $i
9     # Wrong answer

Обновление: ответы подтверждают, что число преобразуется в восьмеричное и что необходимо удалить начальные нули.Вот команда sed для этого.

echo "000010" |sed 's / 0 * //'

Ответы [ 5 ]

5 голосов
/ 07 июля 2010

Это потому, что ведущий 0 означает, что константа является восьмеричной (основание 8), а не десятичной (основание 10). Чтобы остановить это, вам нужно снять ведущие 0s

3 голосов
/ 07 июля 2010

Это лишит ведущие нули, не прибегая к нересту sed (по крайней мере, в ksh93):

$ i=000010
$ i=${i/#*(0)}
$ ((i++))
$ echo $i
11

То же самое работает в Bash, если вы включили расширенную глобализацию (shopt -s extglob).

Edit:

Вы также можете принудительно интерпретировать значение как base-10:

$ i=000010
$ ((i = 10#$i + 1))
$ echo $i
11
3 голосов
/ 07 июля 2010

Ведущий ноль на числе (в C, C ++, C # и др.) Означает «это восьмеричная константа» и (oct) 10 == (dec) 8.

3 голосов
/ 07 июля 2010

Оболочка Korn интерпретирует числа, начинающиеся с нуля, как восьмеричные.

0 голосов
/ 07 июля 2010

Что вы пишите здесь:

$ i="0888"   # 888 with a leading zero.
$ echo ${i}
888          # Is fine.

$ i="000010"
$ echo ${i}
8            # This returns 8 however.

не может быть правдой. Интерпретация числовых литералов происходит только внутри арифметического расширения (т. Е. Двойных паренов). В противном случае 0888 - это обычная строка, и если shell обрезает начальный ноль или преобразует число в другое основание, это будет ужасной ошибкой. Только что проверил в оболочке Korn:

$ i="0888"
$ echo ${i}
0888
$ i="000010"
$ echo ${i}
000010

$ ksh --version
  version         sh (AT&T Research) 93s+ 2008-01-31
...