mirror of https://github.com/tLDP/LDP
109 lines
2.8 KiB
Bash
109 lines
2.8 KiB
Bash
#!/bin/bash
|
|
###########################################################################
|
|
# Shellscript: base.sh - print number to different bases (Bourne Shell)
|
|
# Author : Heiner Steven (heiner.steven@odn.de)
|
|
# Date : 07-03-95
|
|
# Category : Desktop
|
|
# $Id$
|
|
# ==> Above line is RCS ID info.
|
|
###########################################################################
|
|
# Description
|
|
#
|
|
# Changes
|
|
# 21-03-95 stv fixed error occuring with 0xb as input (0.2)
|
|
###########################################################################
|
|
|
|
# ==> Used in ABS Guide with the script author's permission.
|
|
# ==> Comments added by ABS Guide author.
|
|
|
|
NOARGS=85
|
|
PN=`basename "$0"` # Program name
|
|
VER=`echo '$Revision$' | cut -d' ' -f2` # ==> VER=1.2
|
|
|
|
Usage () {
|
|
echo "$PN - print number to different bases, $VER (stv '95)
|
|
usage: $PN [number ...]
|
|
|
|
If no number is given, the numbers are read from standard input.
|
|
A number may be
|
|
binary (base 2) starting with 0b (i.e. 0b1100)
|
|
octal (base 8) starting with 0 (i.e. 014)
|
|
hexadecimal (base 16) starting with 0x (i.e. 0xc)
|
|
decimal otherwise (i.e. 12)" >&2
|
|
exit $NOARGS
|
|
} # ==> Prints usage message.
|
|
|
|
Msg () {
|
|
for i # ==> in [list] missing. Why?
|
|
do echo "$PN: $i" >&2
|
|
done
|
|
}
|
|
|
|
Fatal () { Msg "$@"; exit 66; }
|
|
|
|
PrintBases () {
|
|
# Determine base of the number
|
|
for i # ==> in [list] missing...
|
|
do # ==> so operates on command-line arg(s).
|
|
case "$i" in
|
|
0b*) ibase=2;; # binary
|
|
0x*|[a-f]*|[A-F]*) ibase=16;; # hexadecimal
|
|
0*) ibase=8;; # octal
|
|
[1-9]*) ibase=10;; # decimal
|
|
*)
|
|
Msg "illegal number $i - ignored"
|
|
continue;;
|
|
esac
|
|
|
|
# Remove prefix, convert hex digits to uppercase (bc needs this).
|
|
number=`echo "$i" | sed -e 's:^0[bBxX]::' | tr '[a-f]' '[A-F]'`
|
|
# ==> Uses ":" as sed separator, rather than "/".
|
|
|
|
# Convert number to decimal
|
|
dec=`echo "ibase=$ibase; $number" | bc` # ==> 'bc' is calculator utility.
|
|
case "$dec" in
|
|
[0-9]*) ;; # number ok
|
|
*) continue;; # error: ignore
|
|
esac
|
|
|
|
# Print all conversions in one line.
|
|
# ==> 'here document' feeds command list to 'bc'.
|
|
echo `bc <<!
|
|
obase=16; "hex="; $dec
|
|
obase=10; "dec="; $dec
|
|
obase=8; "oct="; $dec
|
|
obase=2; "bin="; $dec
|
|
!
|
|
` | sed -e 's: : :g'
|
|
|
|
done
|
|
}
|
|
|
|
while [ $# -gt 0 ]
|
|
# ==> Is a "while loop" really necessary here,
|
|
# ==>+ since all the cases either break out of the loop
|
|
# ==>+ or terminate the script.
|
|
# ==> (Above comment by Paulo Marcel Coelho Aragao.)
|
|
do
|
|
case "$1" in
|
|
--) shift; break;;
|
|
-h) Usage;; # ==> Help message.
|
|
-*) Usage;;
|
|
*) break;; # First number
|
|
esac # ==> Error checking for illegal input might be appropriate.
|
|
shift
|
|
done
|
|
|
|
if [ $# -gt 0 ]
|
|
then
|
|
PrintBases "$@"
|
|
else # Read from stdin.
|
|
while read line
|
|
do
|
|
PrintBases $line
|
|
done
|
|
fi
|
|
|
|
|
|
exit
|