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

ЖАНРЫ

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

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

Шрифт:

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.

Пример 12-39. Использование seq для генерации списка аргументов цикла for

#!/bin/bash

# Утилита "seq"

echo

for a in `seq 80` # или так: for a in $( seq 80 )

# То же самое, что и for a in 1 2 3 4 5 ... 80 (но как экономит время и силы!).

# Можно использовать и 'jot' (если эта утилита имеется в системе).

do

echo -n "$a "

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