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 # 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. |