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

ЖАНРЫ

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

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

Шрифт:

bash$ infocmp

# Reconstructed via infocmp from file:

/usr/share/terminfo/r/rxvt

rxvt|rxvt terminal emulator (X Window System),

am, bce, eo, km, mir, msgr, xenl, xon,

colors#8, cols#80, it#8, lines#24, pairs#64,

acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,

bel=^G, blink=\E[5m, bold=\E[1m,

civis=\E[?25l,

clear=\E[H\E[2J, cnorm=\E[?25h, cr=^M,

...

reset

Сбрасывает

настройки терминала и очищает экран. Как и в случае команды clear, курсор и приглашение к вводу (prompt) выводятся в верхнем левом углу терминала.

clear

Команда clear просто очищает экран терминала или окно xterm. Курсор и приглашение к вводу (prompt) выводятся в верхнем левом углу терминала. Эта команда может запускаться как из командной строки, так и из сценария. См. Пример 10-25.

script

Эта утилита позволяет сохранять в файле все символы, введенные пользователем c клавиатуры (вывод тоже). Получая, фактически, подробнейший синхронный протокол сессии.

12.8. Команды выполнения математических операций

factor

Разложение целого числа на простые множители.

bash$ factor 27417

27417: 3 13 19 37

bc

Bash не в состоянии выполнять действия над числами с плавающей запятой и не содержит многих важных математических функций. К счастью существует bc.

Универсальная, выполняющая вычисления с произвольной точностью, утилита bc обладает некоторыми возможностями, характерными для языков программирования.

Синтаксис bc немного напоминает язык C.

Поскольку это утилита UNIX, то она может достаточно широко использоваться в сценариях на языке командной оболочки, в том числе и в конвейерной обработке данных.

Ниже приводится простой шаблон работы с утилитой bc в сценарии. Здесь используется прием подстановки команд.

variable=$(echo "OPTIONS; OPERATIONS" | bc)

Пример 12-32. Ежемесячные выплаты по займу

#!/bin/bash

# monthlypmt.sh: Расчет ежемесячных выплат по займу.

# Это измененный вариант пакета "mcalc" (mortgage calculator),

#+ написанного Jeff Schmidt и Mendel Cooper (ваш покорный слуга).

# [15k]

echo

echo "Введите сумму займа, процентную ставку и срок займа,"

echo "для расчета суммы ежемесячных выплат."

bottom=1.0

echo

echo -n "Сумма

займа (без запятых -- с точностью до доллара) "

read principal

echo -n "Процентная ставка (процент) " # Если 12%, то нужно вводить "12", а не ".12".

read interest_r

echo -n "Срок займа (месяцев) "

read term

interest_r=$(echo "scale=9; $interest_r/100.0" | bc) # Здесь "scale" -- точность вычислений.

interest_rate=$(echo "scale=9; $interest_r/12 + 1.0" | bc)

top=$(echo "scale=9; $principal*$interest_rate^$term" | bc)

echo; echo "Прошу подождать. Вычисления потребуют некоторого времени."

let "months = $term - 1"

# ====================================================================

for ((x=$months; x > 0; x--))

do

bot=$(echo "scale=9; $interest_rate^$x" | bc)

bottom=$(echo "scale=9; $bottom+$bot" | bc)

# bottom = $(($bottom + $bot"))

done

# --------------------------------------------------------------------

# Rick Boivie предложил более эффективную реализацию

#+ цикла вычислений, который дает выигрыш по времени на 2/3.

# for ((x=1; x <= $months; x++))

# do

# bottom=$(echo "scale=9; $bottom * $interest_rate + 1" | bc)

# done

# А затем нашел еще более эффективную альтернативу,

#+ которая выполняется в 20 раз быстрее !!!

# bottom=`{

# echo "scale=9; bottom=$bottom; interest_rate=$interest_rate"

# for ((x=1; x <= $months; x++))

# do

# echo 'bottom = bottom * interest_rate + 1'

# done

# echo 'bottom'

# } | bc` # Внедрить цикл 'for' в конструкцию подстановки команд.

# ====================================================================

# let "payment = $top/$bottom"

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