## 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.