Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

payment=$(echo "scale=2; $top/$bottom" | bc)

# Два знака после запятой, чтобы показать доллары и центы.

echo

echo "ежемесячные выплаты = \$$payment" # Вывести знак "доллара" перед числом.

echo

exit 0

# Упражнения:

# 1) Добавьте

возможность ввода суммы с точностью до цента.

# 2) Добавьте возможность ввода процентной ставки как в виде процентов, так и в виде десятичного числа -- доли целого.

# 3) Если вы действительно честолюбивы,

# добавьте в сценарий вывод полной таблицы помесячных выплат.

Пример 12-33. Перевод чисел из одной системы счисления в другую

:

##########################################################################

# Shellscript: base.sh - вывод чисел в разных системах счисления (Bourne Shell)

# Author : Heiner Steven (heiner.steven@odn.de)

# 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;; # ==> Вывод справочного сообщения.

Поделиться с друзьями: