| Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting | ||
|---|---|---|
| Prev | Chapter 8. Operations and Related Topics | Next |
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 0 # Thanks, Rich Bartell and Stephane Chazelas, for clarification. |