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

ЖАНРЫ

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

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

Шрифт:

{

val=${1#0} # иначе Bash будет считать числа

return $val # восьмеричными (POSIX.2, sect 2.9.2.1).

}

day_index # Формула Гаусса:

{ # Количество дней от 3 Янв. 1600 до заданной даты.

day=$1

month=$2

year=$3

let "month = $month - 2"

if [ "$month" -le 0 ]

then

let "month += 12"

let "year -= 1"

fi

let "year -= $REFYR"

let "indexyr = $year / $CENTURY"

let "Days = $DIY*$year + $year/$LEAPCYCLE - $indexyr + $indexyr/$LEAPCYCLE + $ADJ_DIY*$month/$MIY + $day - $DIM"

#

Более подробное объяснение алгоритма вы найдете в

# http://home.t-online.de/home/berndt.schwerdtfeger/cal.htm

if [ "$Days" -gt "$MAXRETVAL" ] # Если больше 255,

then # то поменять знак

let "dindex = 0 - $Days" # чтобы функция смогла вернуть полное значение.

else let "dindex = $Days"

fi

return $dindex

}

calculate_difference # Разница между двумя датами.

{

let "diff = $1 - $2" # Глобальная переменная.

}

abs # Абсолютное значение

{ # Используется глобальная переменная "value".

if [ "$1" -lt 0 ] # Если число отрицательное

then # то

let "value = 0 - $1" # изменить знак,

else # иначе

let "value = $1" # оставить как есть.

fi

}

if [ $# -ne "$ARGS" ] # Требуется два аргумента командной строки.

then

Param_Error

fi

Parse_Date $1

check_date $day $month $year # Проверка даты.

strip_leading_zero $day # Удалить ведущие нули

day=$? # в номере дня и/или месяца.

strip_leading_zero $month

month=$?

day_index $day $month $year

date1=$?

abs $date1 # Абсолютное значение

date1=$value

Parse_Date $2

check_date $day $month $year

strip_leading_zero $day

day=$?

strip_leading_zero $month

month=$?

day_index $day $month $year

date2=$?

abs $date2 # Абсолютное значение

date2=$value

calculate_difference $date1 $date2

abs $diff # Абсолютное значение

diff=$value

echo $diff

exit 0

# Сравните этот сценарий с реализацией формулы Гаусса на C

# http://buschencrew.hypermart.net/software/datedif

Пример A-9. Создание "словаря"

#!/bin/bash

# makedict.sh [создание словаря]

# Модификация сценария /usr/sbin/mkdict.

#

Авторские права на оригинальный сценарий принадлежат Alec Muffett.

#

# Этот модифицированный вариант включен в документ на основе

#+ документа "LICENSE" из пакета "Crack"

#+ с которым распространяется оригинальный сценарий.

# Этот скрипт обрабатывает текстовые файлы и создает отсортированный список

#+ слов, найденных в этих файлах.

# Он может оказаться полезным для сборки словарей

#+ и проведения лексикографического анализа.

E_BADARGS=65

if [ !
– r "$1" ] # Необходим хотя бы один аргумент --

then #+ имя файла.

echo "Порядок использования: $0 имена_файлов"

exit $E_BADARGS

fi

# SORT="sort" # Необходимость задания ключей сортировки отпала.

#+ Изменено, по отношению к оригинальному сценарию.

cat $* | # Выдать содержимое файлов на stdout.

tr A-Z a-z | # Преобразовать в нижний регистр.

tr ' ' '\012' | # Новое: заменить пробелы символами перевода строки.

# tr -cd '\012[a-z][0-9]' | # В оригинальном сценарии: удалить все символы,

#+ которые не являются буквами или цифрами.

tr -c '\012a-z' '\012' | # Вместо удаления

#+ неалфавитно-цифровые символы заменяются на перевод строки.

sort |

uniq | # Удалить повторяющиеся слова.

grep -v '^#' | # Удалить строки, начинающиеся с "#".

grep -v '^$' # Удалить пустые строки.

exit 0

Пример A-10. Расчет индекса "созвучности"

#!/bin/bash

# soundex.sh: Расчет индекса "созвучности"

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

# Сценарий Soundex

# Автор

# Mendel Cooper

# thegrendel@theriver.com

# 23 Января 2002 г.

#

# Условия распространения: Public Domain.

#

# Несколько отличающаяся версия этого сценария была опубликована

#+ Эдом Шэфером (Ed Schaefer) в Июле 2002 года в колонке "Shell Corner"

#+ "Unix Review" on-line,

#+ http://www.unixreview.com/documents/uni1026336632258/

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

ARGCOUNT=1 # Требуется аргумент командной строки.

E_WRONGARGS=70

if [ $# -ne "$ARGCOUNT" ]

then

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

exit $E_WRONGARGS

fi

assign_value # Присвоить числовые значения

{ #+ символам в имени.

val1=bfpv # 'b,f,p,v' = 1

val2=cgjkqsxz # 'c,g,j,k,q,s,x,z' = 2

val3=dt # и т.п.

val4=l

val5=mn

val6=r

# Попробуйте разобраться в том, что здесь происходит.

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