Командная строка Linux
Шрифт:
[me@linuxbox ~]$ arith-loop
a a**2 a**3
= ==== ====
0 0 0
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
bc — язык калькулятора для вычислений с произвольной точностью
Мы уже знаем, что командная оболочка поддерживает все виды арифметических вычислений с целыми числами, но как быть, если понадобится реализовать какие-нибудь вычисления из высшей математики или хотя бы просто задействовать вещественные числа? Ответ: никак. По крайней мере, средствами командной оболочки. Для подобных вычислений
Другое решение — использовать специализированную программу-калькулятор. В большинстве систем Linux имеется одна из таких программ — программа с именем bc.
Программа bc читает файл с исходным кодом на собственном языке, напоминающем язык C, и выполняет его. Сценарий на языке bc можно хранить в отдельном файле или передавать его на стандартный ввод программы. Язык bc поддерживает массу возможностей, включая переменные, циклы и функции, определяемые программистом. Мы не будем рассматривать программу bc во всех подробностях, а познакомимся лишь с некоторыми ее возможностями, чтобы вы могли получить общее представление. Неплохое описание программы bc можно найти на странице справочного руководства (man).
Начнем с простого примера. Напишем сценарий на языке bc, складывающий два числа — 2 и 2:
/* Очень простой сценарий на языке bc */
2 + 2
Первая строка сценария — это комментарий. Для оформления комментариев в языке bc используется тот же синтаксис, что и в языке программирования C. Комментарии могут размещаться в нескольких строках, начинаясь с пары символов /* и заканчиваясь парой */.
Применение bc
Сохраним сценарий, приведенный выше, в файле foo.bc, а затем выполним его, как показано ниже:
[me@linuxbox ~]$ bc foo.bc
bc 1.06.94
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation,
Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
4
Приглядевшись, можно обнаружить результат в самом низу, после сообщения с информацией об авторских правах. Вывод этого сообщения можно подавить параметром -q (quiet — безмолвно).
bc также можно использовать в интерактивном режиме:
[me@linuxbox ~]$ bc -q
2 + 2
4
quit
В интерактивном режиме мы просто вводим выражения и сразу же получаем результат. Команда quit завершает интерактивный сеанс.
Кроме того, существует возможность передать сценарий на стандартный ввод программы bc:
[me@linuxbox ~]$ bc < foo.bc
4
Эта возможность позволяет передавать сценарии с использованием встроенных документов, встроенных строк и конвейеров. Ниже приводится пример со встроенной строкой:
[me@linuxbox ~]$ bc <<< "2+2"
4
Пример сценария
В качестве практического примера сконструируем сценарий, вычисляющий сумму ежемесячных платежей по кредиту. Для передачи сценария программе bc в следующем примере используется встроенный документ:
#!/bin/bash
# loan-calc : сценарий вычисления суммы ежемесячных платежей по кредиту
PROGNAME=$(basename $0)
usage {
cat <<- EOF
Usage: $PROGNAME PRINCIPAL INTEREST MONTHS
Where:
PRINCIPAL is the amount of the loan.
INTEREST is the APR as a number (7% = 0.07).
MONTHS is the length of the loan's term.
EOF
}
if (($# != 3)); then
usage
exit 1
fi
principal=$1
interest=$2
months=$3
bc <<- EOF
scale = 10
i = $interest / 12
p = $principal
n = $months
a = p * ((i * ((1 + i) ^ n)) / (((1 + i) ^ n) - 1))
print a, "\n"
EOF
Запустив
этот сценарий, вы получите следующие результаты:[me@linuxbox ~]$ loan-calc 135000 0.0775 180
1270.7222490000
В этом примере вычисляется размер ежемесячных платежей по кредиту на сумму $135 000, выданному под 7,75 % годовых на 180 месяцев (15 лет). Обратите внимание на точность результата. Она определяется значением специальной переменной scale в сценарии на языке bc. Полное описание языка bc можно найти на справочной странице (man) для bc. Несмотря на то что форма записи математических выражений немного отличается от используемой в командной оболочке (bc больше напоминает язык C), значительная часть сценария все же выглядит достаточно понятной, учитывая все, что мы узнали к настоящему моменту.
Заключительное замечание
В этой главе мы узнали множество маленьких хитростей, которые могут пригодиться в практической работе. С ростом опыта в создании сценариев умение эффективно работать со строками и числами обретает истинную ценность. Наш сценарий loan-calc показал, что даже простые сценарии могут производить некоторые действительно полезные вычисления.
Дополнительные сведения
Даже при том, что сценарий loan-calc работает, он далек от совершенства. В качестве самостоятельного упражнения попробуйте улучшить сценарий loan-calc, добавив в него следующие возможности:
• полную проверку аргументов командной строки;
• параметр командной строки, реализующий «интерактивный» режим, в котором сценарий будет запрашивать ввод суммы, процента и срока кредита;
• улучшенный формат вывода.
35. Массивы
В предыдущей главе мы научились работать в командной оболочке со строками и числами. Типы данных, которые мы рассматривали до сих пор, в компьютерных кругах известны как скалярные переменные, то есть переменные, способные хранить единственное значение.
В этой главе мы познакомимся еще с одной структурой данных, которая называется массивом, способной хранить множество значений. Массивы поддерживаются практически во всех языках программирования. Командная оболочка также поддерживает их, хотя и в несколько ограниченном виде. Но даже в этом случае они могут использоваться для решения многих задач программирования.
Что такое массивы?
Массивы — это переменные, хранящие более одного значения. Массивы организованы подобно таблице. Возьмем, к примеру, электронную таблицу. Электронная таблица действует подобно двумерному массиву. В ней есть строки и столбцы, и каждая отдельная ячейка имеет свой адрес, определяемый номером строки и номером столбца. Массив устроен аналогично. Массив состоит из ячеек, которые называют элементами, и каждый элемент содержит данные. Доступ к отдельному элементу осуществляется с использованием его адреса, который называется индексом.