Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки | ||
---|---|---|
Назад | Глава 8. Операции и смежные темы | Вперед |
Интерпретатор командной оболочки воспринимает числа как десятичные, в противном случае числу должен предшествовать специальный префикс, либо число должно быть записано в особой нотации. Числа, начинающиеся с символа 0, считаются восьмеричными. если числу предшествует префикс 0x, то число считается шестнадцатиричным. Число, в записи которого присутствует символ #, расценивается как запись числа с указанием основы счисления в виде ОСНОВА#ЧИСЛО.
Пример 8-4. Различные представления числовых констант
#!/bin/bash # numbers.sh: Различные представления числовых констант. # Десятичное: по-умолчанию let "dec = 32" echo "десятичное число = $dec" # 32 # Вобщем-то ничего необычного. # Восьмеричное: числа начинаются с '0' (нуля) let "oct = 032" echo "восьмеричное число = $oct" # 26 # Результат печатается в десятичном виде. # --------- ------ -- ------- # Шестнадцатиричное: числа начинаются с '0x' или '0X' let "hex = 0x32" echo "шестнадцатиричное число = $hex" # 50 # Результат печатается в десятичном виде. # Другие основы счисления: ОСНОВА#ЧИСЛО # ОСНОВА должна быть между 2 и 64. # для записи ЧИСЛА должен использоваться соответствующий ОСНОВЕ диапазон символов, # см. ниже. let "bin = 2#111100111001101" echo "двоичное число = $bin" # 31181 let "b32 = 32#77" echo "32-ричное число = $b32" # 231 let "b64 = 64#@_" echo "64-ричное число = $b64" # 4094 # # Нотация ОСНОВА#ЧИСЛО может использоваться на ограниченном #+ диапазоне основ счисления (от 2 до 64) # 10 цифр + 26 символов в нижнем регистре + 26 символов в верхнем регистре + @ + _ echo echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA)) # 1295 170 44822 3375 # Важное замечание: # -------------- # Использование символов, для записи числа, выходящих за диапазо, #+ соответствующий ОСНОВЕ счисления #+ будет приводить к появлению сообщений об ошибках. let "bad_oct = 081" # numbers.sh: let: oct = 081: value too great for base (error token is "081") # Для записи восьмеричных чисел допускается использовать #+ только цифры в диапазоне 0 - 7. exit 0 # Спасибо Rich Bartell и Stephane Chazelas, за разъяснения.