# 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

 ``` 1 #!/bin/bash 2 # numbers.sh: Representation of numbers in different bases. 3  4 # Decimal: the default 5 let "dec = 32" 6 echo "decimal number = \$dec" # 32 7 # Nothing out of the ordinary here. 8  9  10 # Octal: numbers preceded by '0' (zero) 11 let "oct = 032" 12 echo "octal number = \$oct" # 26 13 # Expresses result in decimal. 14 # --------- ------ -- ------- 15  16  17 # Hexadecimal: numbers preceded by '0x' or '0X' 18 let "hex = 0x32" 19 echo "hexadecimal number = \$hex" # 50 20  21 echo \$((0x9abc)) # 39612 22 # ^^ ^^ double-parentheses arithmetic expansion/evaluation 23 # Expresses result in decimal. 24  25  26  27 # Other bases: BASE#NUMBER 28 # BASE between 2 and 64. 29 # NUMBER must use symbols within the BASE range, see below. 30  31  32 let "bin = 2#111100111001101" 33 echo "binary number = \$bin" # 31181 34  35 let "b32 = 32#77" 36 echo "base-32 number = \$b32" # 231 37  38 let "b64 = 64#@_" 39 echo "base-64 number = \$b64" # 4031 40 # This notation only works for a limited range (2 - 64) of ASCII characters. 41 # 10 digits + 26 lowercase characters + 26 uppercase characters + @ + _ 42  43  44 echo 45  46 echo \$((36#zz)) \$((2#10101010)) \$((16#AF16)) \$((53#1aA)) 47  # 1295 170 44822 3375 48  49  50 # Important note: 51 # -------------- 52 # Using a digit out of range of the specified base notation 53 #+ gives an error message. 54  55 let "bad_oct = 081" 56 # (Partial) error message output: 57 # bad_oct = 081: value too great for base (error token is "081") 58 # Octal numbers use only digits in the range 0 - 7. 59  60 exit \$? # Exit value = 1 (error) 61  62 # Thanks, Rich Bartell and Stephane Chazelas, for clarification.```