Advanced Bash-Scripting Guide:
Prev | Chapter 8. Operations and Related Topics | Next

# 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 $?   # Exit value = 1 (error)

    # Thanks, Rich Bartell and Stephane Chazelas, for clarification.

Prev | Home | Next
Operators | Up | The Double-Parentheses Construct