mirror of https://github.com/tLDP/LDP
63 lines
1.6 KiB
Bash
63 lines
1.6 KiB
Bash
#!/bin/bash
|
|
# numbers.sh: Representation of numbers in different bases.
|
|
|
|
# Decimal: the default
|
|
let "dec = 32"
|
|
echo "decimal number = $dec" # 32
|
|
# Nothing out of the ordinary here.
|
|
|
|
|
|
# Octal: numbers preceded by '0' (zero)
|
|
let "oct = 032"
|
|
echo "octal number = $oct" # 26
|
|
# Expresses result in decimal.
|
|
# --------- ------ -- -------
|
|
|
|
|
|
# Hexadecimal: numbers preceded by '0x' or '0X'
|
|
let "hex = 0x32"
|
|
echo "hexadecimal number = $hex" # 50
|
|
|
|
echo $((0x9abc)) # 39612
|
|
# ^^ ^^ double-parentheses arithmetic expansion/evaluation
|
|
# Expresses result in decimal.
|
|
|
|
|
|
|
|
# Other bases: BASE#NUMBER
|
|
# BASE between 2 and 64.
|
|
# NUMBER must use symbols within the BASE range, see below.
|
|
|
|
|
|
let "bin = 2#111100111001101"
|
|
echo "binary number = $bin" # 31181
|
|
|
|
let "b32 = 32#77"
|
|
echo "base-32 number = $b32" # 231
|
|
|
|
let "b64 = 64#@_"
|
|
echo "base-64 number = $b64" # 4031
|
|
# This notation only works for a limited range (2 - 64) of ASCII characters.
|
|
# 10 digits + 26 lowercase characters + 26 uppercase characters + @ + _
|
|
|
|
|
|
echo
|
|
|
|
echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
|
|
# 1295 170 44822 3375
|
|
|
|
|
|
# Important note:
|
|
# --------------
|
|
# Using a digit out of range of the specified base notation
|
|
#+ gives an error message.
|
|
|
|
let "bad_oct = 081"
|
|
# (Partial) error message output:
|
|
# bad_oct = 081: value too great for base (error token is "081")
|
|
# Octal numbers use only digits in the range 0 - 7.
|
|
|
|
exit $? # Exit value = 1 (error)
|
|
|
|
# Thanks, Rich Bartell and Stephane Chazelas, for clarification.
|