 ## Наши партнеры Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

# 8.2. Numerical Constants

A shell script interprets a number as decimal (base 10), unless that number has a special prefix or notation. A number preceded by a `0` is `octal` (base 8). A number preceded by `0x` is `hexadecimal` (base 16). A number with an embedded `#` evaluates as `BASE#NUMBER` (with range and notational restrictions).

Example 8-4. Representation of numerical constants

 ```#!/bin/bash # numbers.sh: Representation of numbers in different bases. # Decimal: the default let "dec = 32" echo "decimal number = \$dec" # 32 # Nothing out of the ordinary here. # Octal: numbers preceded by '0' (zero) let "oct = 032" echo "octal number = \$oct" # 26 # Expresses result in decimal. # --------- ------ -- ------- # Hexadecimal: numbers preceded by '0x' or '0X' let "hex = 0x32" echo "hexadecimal number = \$hex" # 50 echo \$((0x9abc)) # 39612 # ^^ ^^ double-parentheses arithmetic expansion/evaluation # Expresses result in decimal. # Other bases: BASE#NUMBER # BASE between 2 and 64. # NUMBER must use symbols within the BASE range, see below. let "bin = 2#111100111001101" echo "binary number = \$bin" # 31181 let "b32 = 32#77" echo "base-32 number = \$b32" # 231 let "b64 = 64#@_" echo "base-64 number = \$b64" # 4031 # This notation only works for a limited range (2 - 64) of ASCII characters. # 10 digits + 26 lowercase characters + 26 uppercase characters + @ + _ echo echo \$((36#zz)) \$((2#10101010)) \$((16#AF16)) \$((53#1aA)) # 1295 170 44822 3375 # Important note: # -------------- # Using a digit out of range of the specified base notation #+ gives an error message. let "bad_oct = 081" # (Partial) error message output: # bad_oct = 081: value too great for base (error token is "081") # Octal numbers use only digits in the range 0 - 7. exit \$? # Thanks, Rich Bartell and Stephane Chazelas, for clarification. \$ sh numbers.sh \$ echo \$? \$ 1```