Выбрать главу

#+ его на высокоуровневые языки программирования компилирующего типа.

dc

Утилита dc (desk calculator) -- это калькулятор, использующий "Обратную Польскую Нотацию", и ориентированный на работу со стеком.

Многие стараются избегать испоьзования dc, из-за непривычной формы записи операндов и операций. Однако, dc имеет и своих сторонников.

Пример 12-36. Преобразование чисел из десятичной в шестнадцатиричную систему счисления

#!/bin/bash

# hexconvert.sh: Преобразование чисел из десятичной в шестнадцатиричную систему счисления.

BASE=16 # Шестнадцатиричная.

if [ -z "$1" ]

then

echo "Порядок использования: $0 number"

exit $E_NOARGS

# Необходим аргумент командной строки.

fi

# Упражнение: добавьте проверку корректности аргумента.

hexcvt ()

{

if [ -z "$1" ]

then

echo 0

return # "Return" 0, если функции не был передан аргумент.

fi

echo ""$1" "$BASE" o p" | dc

# "o" устанавливает основание системы счисления для вывода.

# "p" выводит число, находящееся на вершине стека.

# См. 'man dc'.

return

}

hexcvt "$1"

exit 0

Изучение страниц info dc позволит детальнее разобраться с утилитой. Однако, отряд "гуру", которые могут похвастать своим знанием этой мощной, но весьма запутанной утилиты, весьма немногочислен.

Пример 12-37. Разложение числа на простые множители

#!/bin/bash

# factr.sh: Разложение числа на простые множители

MIN=2 # Не работает с числами меньше 2.

E_NOARGS=65

E_TOOSMALL=66

if [ -z $1 ]

then

echo "Порядок использования: $0 number"

exit $E_NOARGS

fi

if [ "$1" -lt "$MIN" ]

then

echo "Исходное число должно быть больше или равно $MIN."

exit $E_TOOSMALL

fi

# Упражнение: Добавьте проверку типа числа (не целые числа должны отвергаться).

echo "Простые множители для числа $1:"

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

echo "$1[p]s2[lip/dli%0=1dvsr]s12sid2%0=13sidvsr[dli%0=1lrli2+dsi!>.]ds.xd1<2" | dc

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

# Автор вышеприведенной строки: Michel Charpentier <charpov@cs.unh.edu>.

# Используется с его разрешения (спасибо).

exit 0

awk

Еще один способ выполнения математических операций, над числами с плавающей запятой, состоит в создании сценария-обертки, использующего математические функции awk.

Пример 12-38. Расчет гипотенузы прямоугольного треугольника

#!/bin/bash

# hypotenuse.sh: Возвращает "гипотенузу" прямоугольного треугольника.

# ( корень квадратный от суммы квадратов катетов)

ARGS=2 # В сценарий необходимо передать два катета.

E_BADARGS=65 # Ошибка в аргументах.

if [ $# -ne "$ARGS" ] # Проверка количества аргументов.

then

echo "Порядок использования: `basename $0` катет_1 катет_2"

exit $E_BADARGS

fi

AWKSCRIPT=' { printf( "%3.7f\n", sqrt($1*$1 + $2*$2) ) } '

# команды и параметры, передаваемые в awk

echo -n "Гипотенуза прямоугольного треугольника, с катетами $1 и $2, = "

echo $1 $2 | awk "$AWKSCRIPT"

exit 0

12.9. Прочие команды

Команды, которые нельзя отнести ни к одной из вышеперечисленных категорий

jot, seq

Эти утилиты выводят последовательность целых чисел с шагом, заданным пользователем.

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

bash$ seq 5

1

2

3

4

5

bash$ seq -s : 5

1:2:3:4:5

Обе утилиты, и jot, и seq, очень удобно использовать для генерации списка аргументов в цикле for.