initial commit
This commit is contained in:
111
chapter14/chg_base_bc.bash
Executable file
111
chapter14/chg_base_bc.bash
Executable file
@@ -0,0 +1,111 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# SCRIPT: chg_base_bc.bash
|
||||
# AUTHOR: Randy Michael
|
||||
# DATE: 10/4/2007
|
||||
# REV: 1.1.A
|
||||
#
|
||||
# PURPOSE: This script converts numbers between base
|
||||
# 2 through base 16 using the bc utility. The user
|
||||
# is prompted for input.
|
||||
#
|
||||
# NOTE: Numbers are in the following format:
|
||||
#
|
||||
# base#number
|
||||
#
|
||||
# EXAMPLE: 16#264bf
|
||||
#
|
||||
##########################################
|
||||
# DEFINE FILES AND VARIABLES HERE
|
||||
##########################################
|
||||
|
||||
# Setup the correct awk usage. Solaris needs to
|
||||
# use nawk instead of awk.
|
||||
|
||||
case $(uname) in
|
||||
SunOS) AWK="nawk"
|
||||
;;
|
||||
*) AWK="awk"
|
||||
;;
|
||||
esac
|
||||
|
||||
##########################################
|
||||
# BEGINNING OF MAIN
|
||||
##########################################
|
||||
|
||||
# Prompt the user for an input number with base
|
||||
|
||||
echo -e "\nInput the number to convert in the following format:
|
||||
|
||||
Format: base#number
|
||||
|
||||
Example: 16#264BF \n"
|
||||
|
||||
read IBASE_NUM
|
||||
|
||||
# Extract the base from the ibase_num variable
|
||||
|
||||
IBASE=$(echo $IBASE_NUM | $AWK -F '#' '{print $1}')
|
||||
INUMBER=$(echo $IBASE_NUM | $AWK -F '#' '{print $2}')
|
||||
|
||||
# Test to ensure the input base is between 2 and 16
|
||||
|
||||
if (( IBASE < 2 || IBASE > 16 ))
|
||||
then
|
||||
echo -e "\nERROR: Input base must be between 2 and 16\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# The bc utility requires all number bases greater
|
||||
# than 10 use uppercase characters for all
|
||||
# non-numeric character numbers, i.e. hex numbers.
|
||||
# We use the tr command to upcase all lowercase
|
||||
# characters.
|
||||
|
||||
if (( IBASE > 10 ))
|
||||
then
|
||||
INUMBER=$(echo $INUMBER | tr '[a-z]' '[A-Z]')
|
||||
fi
|
||||
|
||||
# Ask the user for the output base
|
||||
|
||||
echo -e "\nWhat base do you want to convert $IBASE_NUM to?
|
||||
NOTE: base 2 through 16 are valid\n"
|
||||
echo -e "Output base: \c"
|
||||
read OBASE
|
||||
|
||||
# Test to ensure the output base is an integer
|
||||
|
||||
case $OBASE in
|
||||
[0-9]*) : # do nothing
|
||||
;;
|
||||
*) echo -e "\nERROR: $obase is not a valid number\n"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Test to ensure the output base is between 2 and 16
|
||||
|
||||
if (( OBASE < 2 || OBASE > 16 ))
|
||||
then
|
||||
echo -e "\nERROR: Output base must be between 2 and 16\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Save the input number before changing the base
|
||||
|
||||
IN_BASE_NUM=$IBASE_NUM
|
||||
|
||||
# Convert the input number to decimal
|
||||
|
||||
DEC_EQUIV=$(echo "ibase=$IBASE; $INUMBER" | bc)
|
||||
|
||||
# Convert the number to the desired output base
|
||||
|
||||
RESULT=$(echo "obase=$OBASE; $DEC_EQUIV" | bc)
|
||||
|
||||
# Display the result
|
||||
|
||||
echo -e "\nInput number $IN_BASE_NUM is equivalent to \
|
||||
${OBASE}#${RESULT}\n"
|
||||
|
||||
Reference in New Issue
Block a user