Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
1998
2nd
8790
4399
4345
679
BOOKS
1998
2nd
889
430
2452
785
GIFTS
1998
2nd
9822
4822
3555
578
STAT
1998
3rd
8911
4589
2344
8690
BOOKS
1998
3rd
333
1489
6322
889
GIFTS
1998
3rd
2310
1483
3443
778
STAT
1998
4th
9883
5199
2344
6456
BOOKS
1998
4th
7333
3892
5223
887
GIFTS
1998
4th
8323
4193
2342
980
Сценарий формы.
$ pg gifts.cgi
t!/bin/sh
# сценарий gifts.cgi …. используется POST
echo "Content-type: text/html"
echo ""
echo "<HTML>"
echo "<BODY>"
# gifts_result.cgi используется для обработки вывода этой формы
echo "<FORM action="/cgi-bin/gifts_result.cgi" METHOD=POST>"
echo ""
echo "<HR>"
echo "<H1><CENTER>GIFTS Inc <BR>"
echo "QUARTERLY REPORT</H1></CENTER>"
echo "<HR>"
echo "Department: <SELECT NAME=dept>"
echo "<OPTION>GIFTS"
echo "<OPTION>STATIONERY"
echo "<OPTION>BOOKS"
echo "</SELECT>"
echo "Quarter End:<SELECT NAME=qtr>"
echo "<OPTION>1st"
echo "<OPTION>2nd"
echo "<OPTION>3rd"
echo "<OPTION>4th"
echo "</SELECT>"
echo "<BR><BR>"
echo "Report To Co To:<BR>"
echo "<INPUT TYPE="radio" NAME=stdout VALUE=Printer>Printer"
echo "<INPUT TYPE="radio" NAME=stdout VALUE=Screen CHECKED>Screen"
echo "<INPUT TYPE="radio" NAME=stdout VALUE=Both>Both"
echo "<BR><BR><HR>"
echo "<INPUT TYPE=Submit VALUE="Send it">"
echo "<INPUT TYPE=Reset VALUE="Clear">"
echo "</FORM>"
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. Выборка квартальной информации для дальнейшей обработки
Сценарий обрабатывает информацию, выбранную пользователем, и генерирует вывод, показанный на рис. 29.14.