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

118 lines
2.4 KiB
Bash
Executable File

#!/bin/ksh
#
# SCRIPT: chg_base.ksh
# AUTHOR: Randy Michael
# DATE: 10/4/2007
# REV: 1.1.A
#
# PURPOSE: This script converts numbers between base
# 2 through base 36. 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
# Set up 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
##########################################
# BEGINNING OF MAIN
##########################################
# Prompt the user for an input number with base
echo "\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}')
# Test to ensure the input base is an integer
case $ibase in
[0-9]*) : # do nothing
;;
*) echo "\nERROR: $ibase is not a valid number for input base\n"
exit 1
;;
esac
# Test to ensure the input base is between 2 and 36
if (( ibase < 2 || ibase > 36 ))
then
echo "\nERROR: Input base must be between 2 and 36\n"
exit 1
fi
# Ask the user for the output base
echo "\nWhat base do you want to convert $ibase_num to?
NOTE: base 2 through 36 are valid\n"
echo "Output base: \c"
read obase
# Test to ensure the output base is an integer
case $obase in
[0-9]*) : # do nothing
;;
*) echo "\nERROR: $obase is not a valid number\n"
exit 1
;;
esac
# Test to ensure the output base is between 2 and 36
if (( obase < 2 || obase > 36 ))
then
echo "\nERROR: Output base must be between 2 and 36\n"
exit 1
fi
# Save the input number before changing the base
in_base_num=$ibase_num
# Convert the input number to the desire output base
typeset -i$obase ibase_num
# Assign the output base number to an appropriate variable name
obase_num=$ibase_num
# Display the result
echo "\nInput number $in_base_num is equivalent to $obase_num\n"