Numerical Constants

Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting
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

       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.

Prev | Home | Next
Operations and Related Topics | Up | The Double-Parentheses Construct