Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
fi
# отображение имени метода и кодированной строки
echo "Method : $REQUEST_METHOD"
echo "Query String : $QUERY_STRING"
echo "<HR>"
# используется 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 для преобразования шестнадцатеричных символов
printf "${NAME}=${TYPE}n"
VARS=`printf "${NAME}=\${TYPE}n"`
eval `printf $VARS`
done
echo "<HR>"
if [ "$contact" != "" ]; then
printf "Hello $contact, it's great to meet youn"
else
printf "You did not give me your name… no comment !n"
fi
if [ "$film" != " — Pick a Film —" ]; then
printf "Hey I agree, $FILM is great filmn"
else
printf "You didn't pick a filmn"
fi
if i "$actor" != " —- Pick Your Favourite Actor --" ]; then
printf "So you like the actor $actor, good calln"
else
printf "You didn't pick a actor from the menun"
fi
if [ "$view_cine"="on" ]; then
printf "Yes, I agree the cinema ls still the best place to watch a filmn" else
printf "So you don't go to the cinema, do you know what you're missingn" fi
if [ "$view_vid"="on" ]; then
printf "I like watching videos at home as welln"
else
printf "No video!!. you're missing out on all the classics to rent or buyn'
fi
if [ "$textarea" != "" ]; then
printf " And here are your comments…OK $textarean"
else
printf "No comments entered, so no comment !n"
fi
echo "</PRE>"
echo "</HTML>"
Обратите внимание, что в этом сценарии везде используется функция printf; хотя в некоторых случаях могут быть задействованы конструкции echo (когда не требуется доступ к переменным). Применение функций printf улучшает восприятие сценариев.
Теперь загрузим форму и осуществим тестирование путем отсылки некоторых данных с помощью метода post:
http://<имя_сервера>/cgi‑bin/books.cgi
На рис. 29.11 иллюстрируются данные, введенные на Web–страницу. После завершения ввода некоторых данных щелкните на кнопке "Send". Результаты выполнения этой операции показаны на рис. 29.12.
Рис. 29.11. Форма cgi, в которой используется метод post
Сценарий опрашивает различные переменные для того, чтобы установить факт ввода информации. Затем будет выполнена дальнейшая обработка, позволяющая убедиться в том, что все поля имеют значения. Если значения имеются не для всех полей, форма возвращается пользователю и отображается запрос на повторный ввод информации. Как только форма будет корректно заполнена, ее можно добавить в файл. Таким образом можно создавать небольшие базы данных.
Рис. 29.12. Данные формы были полностью декодированы с помощью метода post
Практическое применение сценария cgi
Создадим сценарий, который будет выполнять некоторую полезную обработку. Пусть это будет отчет какой‑то фиктивной компании, именуемой Wonder Gifts.
Файл отчета содержит номера различных товаров, проданных в каждом квартале 1998 г. Номера товаров соответствуют отделам Stationery, Books и Gifts.
Наша задача -cоздать отчет, который основан на запросе Пользователя. Пользователь может делать выборку по номеру квартала либо по названию отдела. Необходимо выполнить дополнительную обработку, которая заключается в суммировании месячных продаж товаров по кварталам. Результаты могут выводиться на экран, принтер либо на экран и принтер одновременно.
В данном случае форма будет содержать два раскрывающихся меню и переключатель. Одно меню предназначено для выборки по кварталам, второе — для выборки по отделам. Переключатель служит для выбора устройства вывода. В нашем примере отчет выводится только на экран; переключатели выполняют демонстрационную роль.
Ниже приводится файл данных, содержащий сведения о продаже по кварталам. В нем имеются следующие поля: отдел, год, квартал, и количество различных товаров.
$ pg qtr_1998.txt
STAT
1998
1st
7998
4000
2344
2344
BOOKS
1998
1st
3590
1589
2435
989
GIFTS
1998
1st
2332
1489
2344
846
STAT
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 "<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>"