Книга: Искусство программирования на языке сценариев командной оболочки
Пример 12-33. Перевод чисел из одной системы счисления в другую
Пример 12-33. Перевод чисел из одной системы счисления в другую
:
##########################################################################
# Shellscript: base.sh - вывод чисел в разных системах счисления (Bourne Shell)
# Author : Heiner Steven ([email protected])
# Date : 07-03-95
# Category : Desktop
# $Id: base.sh,v 1.2 2000/02/06 19:55:35 heiner Exp $
##########################################################################
# Description
#
# Changes
# 21-03-95 stv исправлена ошибка, возникающая при вводе числа 0xb (0.2)
##########################################################################
# ==> Используется в данном документе с разрешения автора.
# ==> Комментарии добавлены автором документа.
NOARGS=65
PN=`basename "$0"` # Имя программы
VER=`echo '$Revision: 1.2 $' | cut -d' ' -f2` # ==> VER=1.2
Usage () {
echo "$PN - вывод чисел в различных системах счисления, $VER (stv '95)
Порядок использования: $PN [number ...]
Если число не задано, то производится ввод со stdin.
Число может быть:
двоичное должно начинаться с комбинации символов 0b (например 0b1100)
восьмеричное должно начинаться с 0 (например 014)
шестнадцатиричное должно начинаться с комбинации символов 0x (например 0xc)
десятичное в любом другом случае (например 12)" >&2
exit $NOARGS
} # ==> Функция вывода сообщения о порядке использования.
Msg () {
for i # ==> [список] параметров опущен.
do echo "$PN: $i" >&2
done
}
Fatal () { Msg "$@"; exit 66; }
PrintBases () {
# Определение системы счисления
for i # ==> [список] параметров опущен...
do # ==> поэтому работает с аргументами командной строки.
case "$i" in
0b*) ibase=2;; # двоичная
0x*|[a-f]*|[A-F]*) ibase=16;; # шестнадцатиричная
0*) ibase=8;; # восьмеричная
[1-9]*) ibase=10;; # десятичная
*)
Msg "Ошибка в числе $i - число проигнорировано"
continue;;
esac
# Удалить префикс и преобразовать шестнадцатиричные цифры в верхний регистр (этого требует bc)
number=`echo "$i" | sed -e 's:^0[bBxX]::' | tr '[a-f]' '[A-F]'`
# ==> вместо "/", здесь используется символ ":" как разделитель для sed.
# Преобразование в десятичную систему счисления
dec=`echo "ibase=$ibase; $number" | bc` # ==> 'bc' используется как калькулятор.
case "$dec" in
[0-9]*) ;; # все в порядке
*) continue;; # ошибка: игнорировать
esac
# Напечатать все преобразования в одну строку.
# ==> 'вложенный документ' -- список команд для '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 ]
do
case "$1" in
--) shift; break;;
-h) Usage;; # ==> Вывод справочного сообщения.
-*) Usage;;
*) break;; # первое число
esac # ==> Хорошо бы расширить анализ вводимых символов.
shift
done
if [ $# -gt 0 ]
then
PrintBases "$@"
else # чтение со stdin
while read line
do
PrintBases $line
done
fi
Один из вариантов вызова bc -- использование вложенного документа, внедряемого в блок с подстановкой команд. Это особенно актуально, когда сценарий должен передать bc значительный по объему список команд и аргументов.
variable=`bc << LIMIT_STRING
options
statements
operations
LIMIT_STRING
`
...или...
variable=$(bc << LIMIT_STRING
options
statements
operations
LIMIT_STRING
)
- Пример 12-32. Ежемесячные выплаты по займу
- Пример 12-33. Перевод чисел из одной системы счисления в другую
- Пример 12-34. Пример взаимодействия bc со "встроенным документом"
- Пример 12-35. Вычисление числа "пи"
- Пример 12-36. Преобразование чисел из десятичной в шестнадцатиричную систему счисления
- Пример 12-37. Разложение числа на простые множители
- Пример 12-38. Расчет гипотенузы прямоугольного треугольника
- Пример 12-34. Пример взаимодействия bc со "встроенным документом"
- Пример установочного скрипта
- Пример из практики
- Перевод базы данных InterBase 6.x на 3-й диалект
- Особенности системы защиты данных в InterBase
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Примеры получения статистики
- Пример применения метода «пять почему»
- Пример 12-8. Частота встречаемости отдельных слов
- 1.2.5. Пример программы
- Установка системы на уже подготовленный жесткий диск
- Пример 17-10. Блочный комментарий