Сценарий по умолчанию выводит очень большие числа, которые трудно прочитать. Чтобы отобразить данные в единицах, более простых для восприятия (например, в целых Биткоинах), можно использовать сценарий scriptbc (сценарий № 9 в главе 1). Поддержка аргумента точности позволила бы выводить данные в удобочитаемом формате.
№ 62. Определение изменений в веб-страницах
Иногда, просматривая существующие решения, мы с воодушевлением говорим себе: «Оказывается, это совсем несложно». Слежение за изменениями на веб-сайтах — удивительно простой способ собирать такие воодушевляющие образцы. Сценарий в листинге 7.20, changetrack, автоматизирует эту задачу. Данный сценарий имеет одну интересную особенность: обнаружив изменения на сайте, он не просто выводит уведомление в командной строке, а посылает пользователю новую веб-страницу по электронной почте.
Код
Листинг 7.20. Сценарий changetrack
#!/bin/bash
# changetrack — проверяет страницу по указанному URL и, если она
#·· изменилась с момента последнего посещения, посылает новую страницу
#····по указанному адресу электронной почты.
sendmail=$(which sendmail)
sitearchive="/tmp/changetrack"
tmpchanges="$sitearchive/changes.$$" # Временный файл
fromaddr="[email protected]"
dirperm=755······ # чтение+запись+выполнение для владельца каталога
fileperm=644······# чтение+запись для владельца, только чтение для других
trap "$(which rm) −f $tmpchanges" 0 1 15 # Удалить временный файл при выходе.
if [$# −ne 2]; then
··echo "Usage: $(basename $0) url email" >&2
··echo " tip: to have changes displayed on screen, use email addr '-'" >&2
··exit 1
fi
if [! -d $sitearchive]; then
··if! mkdir $sitearchive; then
····echo "$(basename $0) failed: couldn't create $sitearchive." >&2
····exit 1
··fi
··chmod $dirperm $sitearchive
fi
if ["$(echo $1 | cut −c1-5)"!= "http: "]; then
··echo "Please use fully qualified URLs (e.g. start with 'http://')" >&2
··exit 1
fi
fname="$(echo $1 | sed 's/http: \/\///g' | tr '/?&' '…')"
baseurl="$(echo $1 | cut −d/ −f1-3)/"
# Загрузить копию веб-страницы и поместить в файл архива. Обратите
#·· внимание, что изменения определяются по чистому содержимому
#·· (используется флаг −dump, а не −source), поэтому можно не заниматься
#·· парсингом разметки HTML….
lynx −dump "$1" | uniq > $sitearchive/${fname}.new
if [-f "$sitearchive/$fname"]; then
··# Этот сайт просматривался прежде, так что сравним старую и новую
··#·· копии с помощью diff.
··diff $sitearchive/$fname $sitearchive/${fname}.new > $tmpchanges
··if [-s $tmpchanges]; then
····echo "Status: Site $1 has changed since our last check."
··else
····echo "Status: No changes for site $1 since last check."
····rm −f $sitearchive/${fname}.new··# Ничего нового…
····exit 0·························· # Изменений нет, выйти.
··fi
else
··echo "Status: first visit to $1. Copy archived for future analysis."
··mv $sitearchive/${fname}.new $sitearchive/$fname
··chmod $fileperm $sitearchive/$fname
··exit 0
fi