Files
mastering-unix-ss/chapter14/equate_any_base.ksh
Fabio Scotto di Santolo 4cc88d2f6e initial commit
2020-07-28 19:28:25 +02:00

178 lines
4.3 KiB
Bash
Executable File

#!/usr/bin/ksh
#
# SCRIPT: equate_any_base.ksh
# AUTHOR: Randy Michael
# DATE: 07/07/2007
# REV: 1.2.P
#
# PURPOSE: This script is used to convert a number to any
# supported number base, which is at least base 36.
# This script requires that two command line
# auguments and the "number" to be converted
# are present on the command line. An example
# number base conversion is shown here:
#
# equate_any_base.ksh -f16 -t2 e245c
# 2#11100010010001011100
#
# This example converts the base 16 number, e245c, to
# the base 2 equivalent, 2#11100010010001011100.
# The 2#, which precedes the binary number, shows
# the base of the number represented.
#
# EXIT CODES:
# 0 - Normal script execution
# 1 - Usage error
#
# set -x # Uncomment to debug this shell script
# set -n # Uncomment to check syntax without any execution
#
######################################################
# DEFINE FILES AND VARIABLES HERE
######################################################
SCRIPT_NAME=$(basename $0)
COUNT=0
MAX_COUNT=$#
# Setup the correct echo command usage. Many Linux
# distributions will execute in BASH even if the
# script specifies Korn shell. BASH shell requires
# we use echo -e when we use \n, \c, etc.
case $SHELL in
*/bin/bash) alias echo="echo -e"
;;
esac
######################################################
# DEFINE FUNCTIONS HERE
######################################################
function usage
{
echo "\nUSAGE: $SCRIPT_NAME -f{starting base} -t{ending base} NUMBER"
echo "\nEXAMPLE: $SCRIPT_NAME -f16 -t10 FC23"
echo "\nWill return the decimal base 10 number 64547"
echo "\t ...EXITING...\n"
}
######################################################
# CHECK COMMAND LINE AUGUMENTS HERE
######################################################
# The maximum number of command line arguments is five
# and the minimum number is three.
if (($# > 5))
then
echo "\nERROR: Too many command line arguments\n"
usage
exit 1
elif (($# < 3))
then
echo "\nERROR: Too few command-line arguments\n"
usage
exit 1
fi
# Check to see if the command-line switches are present
echo $* | grep -q '\-f' || (usage; exit 1)
echo $* | grep -q '\-t' || (usage; exit 1)
# Use getopts to parse the command line arguments
while getopts ":f:t:" ARGUMENT
do
case $ARGUMENT in
f) START_BASE="$OPTARG"
;;
t) END_BASE="$OPTARG"
;;
\?) usage
exit 1
;;
esac
done
# Ensure that the START_BASE and END_BASE variables
# are not NULL.
if [ -z "$START_BASE" ] || [ "$START_BASE" = '' ] \
|| [ -z "$END_BASE" ] || [ "$END_BASE" = '' ]
then
echo "\nERROR: Base number conversion fields are empty\n"
usage
exit 1
fi
# Ensure that the START_BASE and END_BASE variables
# have integer values for the number base conversion.
case $START_BASE in
+([0-9])) : # Do nothing - Colon is a no-op.
;;
*) echo "\nERROR: $START_BASE is not an integer value"
usage
exit 1
;;
esac
case $END_BASE in
+([0-9])) : # Do nothing - Colon is a no-op.
;;
*) echo "\nERROR: $END_BASE is not an integer value"
usage
exit 1
;;
esac
######################################################
# BEGINNING OF MAIN
######################################################
# Begin by finding the BASE_NUM to be converted.
# Count from 1 to the max number of command line auguments
while ((COUNT < MAX_COUNT))
do
((COUNT == COUNT + 1))
TOKEN=$1
case $TOKEN in
-f) shift; shift
((COUNT == COUNT + 1))
;;
-f${START_BASE}) shift
;;
-t) shift; shift
((COUNT == COUNT + 1))
;;
-t${END_BASE}) shift
;;
*) BASE_NUM=$TOKEN
break
;;
esac
done
# Typeset the RESULT variable to the target number base
typeset -i$END_BASE RESULT
# Assign the BASE_NUM variable to the RESULT variable
# and add the starting number base with a pound sign (#)
# as a prefix for the conversion to take place.
# NOTE: If an invalid number is entered a system error
# will be displayed. An example is inputting 1114400 as
# a binary number, which is invalid for a binary number.
RESULT="${START_BASE}#${BASE_NUM}"
# Display the result to the user or calling program.
echo "$RESULT"
# End of script...