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 $?      # Thanks, Rich Bartell and Stephane Chazelas, for clarification.
  61 
  62 $ sh numbers.sh
  63 $ echo $?
  64 $ 1