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

ЖАНРЫ

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.

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