Сценарий формы.
$ 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 "<P>"
echo "<HR>"
echo "<H1><CENTER>GIFTS Inc <BR>"
echo "QUARTERLY REPORT</H1></CENTER>"
echo "</P><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.