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 # is evaluated as BASE#NUMBER (this option is of limited usefulness because of range restrictions).


Example 8-4. Representation of numerical constants:

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