echo "</BODY>"

echo "</HTML>"

Переменной dept присваивается выбранное значение для отдела; переменной qtr присваивается номер выбранного квартала. Переменной stdout присваивается значение "printer", "screen" или "both"; в качестве значения по умолчанию выбирается screen (это значение указывается с помощью слова "CHECKED"). Ниже приведен сценарий, обрабатывающий полученную информацию.

$ pg gifts_result.cgi

#!/bin/sh

#сценарий gifts_result.cgi

#Декодирование строки URL

еcho "Content‑type: text/html"

echo ""

echo "<HTML><PRE>"

# это post ???

if [ "$REQUEST_METH0D" = "POST" ]; then

QUERY_STRING=`cat -`

fi

# декодирование

# используется sed для замены & символом табуляции

LINE=`echo $QUERY_STRING | sed 's/&/ /g'`

for LOOP in $LINE

do

NAME=`echo $LOOP | sed 's/=/ /g' | awk '{print $1}'`

TYPE='echo $LOOP | sed 's/=/ /g' | awk '{print $2}' | \

sed -e 's/%\(\)/\\\x/g' | sed 's/+/ /g'`

# используется printf при выполнении шестнадцатеричных преобразований VARS=`printf "${NAME}=\\${TYPE}\n"`

eval `printf $VARS`

done

echo "<HR>"

echo "<Hi><CENTER> GIFTS Inc</CENTER></H1>"

echo "<H2><CENTER> Quarter End Results </CENTER></H2>"

echo "<HR>"

#нужно изменить имена полей со STATIONERY на STAT

#для осуществления корректного поиска

if [ "$DEPT"="STATIONERY" ]; then

dept=STAT

fi

# считывание из файла qtr_1995.txt

TOTAL=0

while read DEPT YEAR Q P1 P2 Р3 Р4

do

if [ "$DEPT"="$DEPT" -a "$Q"="$qtr" ]; then

TOTAL=`expr $P1 + $P2 + $P3 + $P4`

fi

continue

done </home/httpd/cgi‑bin/qtr_1995.txt

echo "<H2>"

echo " TOTAL ITEMS SOLD IN THE $DEPT DEPARTMENT"

echo "is $TOTAL IN THE $qtr QUARTER"

echo "</H2><HR>"

# куда будет выведен отчет

if [ "$stdout"="Both" ]; then

echo "This report ls going to the printer and the screen"

else

echo " This report ls going to the $stdout"

fi

echo "</PRE>"

echo "</HTML>"

Первая часть сценария является общей для любой формы, обработка которой осуществляется с помощью метода post. Поскольку отсутствуют шестнадцатеричные значения для преобразования (так как поля ввода являются предопределенными опциями меню), нет нужды в использовании функции printf, но особого смысла в том, чтобы отказаться от использования этой команды, нет. Содержательная часть сценария выполняет считывание из файла qtr_1995.txt.

Цикл while осуществляет считывание и присваивание значений полей переменным dept, year, q, p1, Р2, P3, Р4 соответственно. Затем выполняется проверка значения переменной $dept (значение, отправленное пользователем) и переменной dept; результат конкатенируется с результатом другой проверки с помощью оператора AND. Если значение переменной $qtr (значение, отосланное пользователем) равно значению переменной Q, имеет место соответствие. Все числа, содержащиеся в сравниваемой строке, добавляются вместе.

В настоящее время в нашем распоряжении имеется сценарий формы и сценарий, предназначенный для обработки информации, пересылаемой формой (запустите этот сценарий). Введите URL (либо создайте соответствующую ссылку на главной странице):

http://<имя_сервера>/cgi‑bin/gifts.cgi

Результаты показаны на рис 29.13.

Рис. 29.13. Выборка квартальной информации для дальнейшей обработки

Linux и UNIX: программирование в shell. Руководство разработчика _19.jpg

Сценарий обрабатывает информацию, выбранную пользователем, и генерирует вывод, показанный на рис. 29.14.

Linux и UNIX: программирование в shell. Руководство разработчика _20.jpg

Рис. 29.14. Обработка завершена, вывод результатов

29.5.3. Заполнение списка

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

Следующий сценарий реализует заполнение раскрывающегося списка данными, содержащимися в текстовом файле list Этот файл находится во временном каталоге, но не в корневом каталоге web–сервера. Цикл while используется для считывания содержимого (построчно( из файла. Для заполнения списка используется следующий кода:

echo "<OPTION>$LINE"

Выбранный элемент присваивается переменной menu_selection. Ниже приводится сценарий, заполняющий элементы меню; действие формы не указывается.

$ pg populat.cgi

#!/bin/sh

#сценарий populat.cgi

#заполнение раскрывающегося списка значениями из текстового файла

echo "Content‑type: text/html"

echo ""

echo "<HTML>"

echo "<BODY>"

echo "<H4> CGI FORM….populat.cgi..populate pull‑down list from a text

file</H4>"

echo "<SELECT NAME=menu_selecflon>"

echo "<OPTION>— PICK AN OPTION —"

# считывание значений из файла для заполнения опций списка

while read LINE

do

echo "<OPTION>$LINE" done < ../temp/list

echo "</SELECT>"

echo "</FORM>"

echo "</BODY>"

echo "</HTML>"

29.5.4. Автоматическое обновление Web–страницы

При использовании cgi для программирования заданий, выполняющих функции мониторинга либо контроля, часто бывает удобно выполнять обновление страниц в непрерывном режиме. Для этого вызывается пользовательский сценарий или страница. Ниже приводится тег, вызывающий выполнение сценария dfspace.cgi каждые 60 секунд.

<meta http‑equiv="Refresh" content="60;URL=http:/linux.pc/cgi‑bin/dfspace.cgi">"

Здесь ключевым словом является слово Refresh. Благодаря его использованию Web–сервер получает сведения о загрузке данной страницы, а строка "content=60" задает время (в секундах( между повторными загрузками. Для обновления сценария просто добавьте имя сценария в качестве части адреса URL.

В распоряжении автора имеются несколько контролирующих сценариев, выполняющих опрос всех основных хостов в сети. Благодаря их применению можно сразу же определить, какие хосты выполняются, а какие -oтключены. Более симпатичный вид сценарию придает использование в тексте вместо опций on и off зеленых и красных шариков.

Ниже приводится сценарий, использующий часть вывода df и отображающий файловую систему и количество полей в таблице.

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

echo "<TABLE align="center" cellspacing="20" border=9 width="40%"

cols="2">"

echo "<TH align="center">- Capacity % -</TH>"

echo "<TH align="center">- File System -</TH>"

Параметр cellspacing устанавливает расстояние между внутренними и внешними границами таблицы. Параметр border хранит число, определяющее толщину табличной рамки. Параметр col s определяет количество столбцов в таблице. Ниже приведена основная часть описываемого сценария.