8.2. Числовые константы


Интерпретатор командной оболочки воспринимает числа как десятичные, в противном случае числу должен предшествовать специальный префикс, либо число должно быть записано в особой нотации. Числа, начинающиеся с символа 0, считаются восьмеричными. если числу предшествует префикс 0x, то число считается шестнадцатиричным. Число, в записи которого присутствует символ #, расценивается как запись числа с указанием основы счисления в виде ОСНОВА#ЧИСЛО.

Пример 8-4. Различные представления числовых констант

  1. #!/bin/bash
  2. # numbers.sh: Различные представления числовых констант.
  3. # Десятичное: по-умолчанию
  4. let "dec = 32"
  5. echo "десятичное число = $dec"             # 32
  6. # Вобщем-то ничего необычного.
  7. # Восьмеричное: числа начинаются с '0' (нуля)
  8. let "oct = 032"
  9. echo "восьмеричное число = $oct"           # 26
  10. # Результат печатается в десятичном виде.
  11. # --------- ------ — -------
  12. # Шестнадцатиричное: числа начинаются с '0x' или '0X'
  13. let "hex = 0x32"
  14. echo "шестнадцатиричное число = $hex"      # 50
  15. # Результат печатается в десятичном виде.
  16. # Другие основы счисления: ОСНОВА#ЧИСЛО
  17. # ОСНОВА должна быть между 2 и 64.
  18. # для записи ЧИСЛА должен использоваться соответствующий ОСНОВЕ диапазон символов,
  19. # см. ниже.
  20. let "bin = 2#111100111001101"
  21. echo "двоичное число = $bin"               # 31181
  22. let "b32 = 32#77"
  23. echo "32-ричное число = $b32"              # 231
  24. let "b64 = 64#@_"
  25. echo "64-ричное число = $b64"              # 4094
  26. #
  27. #  Нотация ОСНОВА#ЧИСЛО может использоваться на ограниченном
  28. #+ диапазоне основ счисления (от 2 до 64)
  29. #  10 цифр + 26 символов в нижнем регистре + 26 символов в верхнем регистре + @ + _
  30. echo
  31. echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
  32.                                          # 1295 170 44822 3375
  33. #  Важное замечание:
  34. #  --------------
  35. #  Использование символов, для записи числа, выходящих за диапазо,
  36. #+ соответствующий ОСНОВЕ счисления
  37. #+ будет приводить к появлению сообщений об ошибках.
  38. let "bad_oct = 081"
  39. # numbers.sh: let: oct = 081: value too great for base (error token is "081")
  40. #                  Для записи восьмеричных чисел допускается использовать
  41. #+                 только цифры в диапазоне 0 - 7.
  42. exit 0       # Спасибо Rich Bartell и Stephane Chazelas, за разъяснения.