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 # Hexadecimal: numbers preceded by '0x' or '0X'
  17 let "hex = 0x32"
  18 echo "hexadecimal number = $hex"         # 50
  19 # Expresses result in decimal.
  20 
  21 # Other bases: BASE#NUMBER
  22 # BASE between 2 and 64.
  23 # NUMBER must use symbols within the BASE range, see below.
  24 
  25 let "bin = 2#111100111001101"
  26 echo "binary number = $bin"              # 31181
  27 
  28 let "b32 = 32#77"
  29 echo "base-32 number = $b32"             # 231
  30 
  31 let "b64 = 64#@_"
  32 echo "base-64 number = $b64"             # 4031
  33 #
  34 # This notation only works for a limited range (2 - 64)
  35 # 10 digits + 26 lowercase characters + 26 uppercase characters + @ + _
  36 
  37 echo
  38 
  39 echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
  40                                          # 1295 170 44822 3375
  41 
  42 
  43 #  Important note:
  44 #  --------------
  45 #  Using a digit out of range of the specified base notation
  46 #+ will give an error message.
  47 
  48 let "bad_oct = 081"
  49 # Error message output:
  50 # numbers.sh: let: oct = 081: value too great for base (error token is "081")
  51 #             Octal numbers use only digits in the range 0 - 7.
  52 
  53 exit 0       # Thanks, Rich Bartell and Stephane Chazelas, for clarification.