Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
EMPLOYEE NO
89232
FIRST NAME
Peter
SURNAME
Wilson
DEPARTMENT
IT
Do You Wish To Print This Record [Y..N] [N] :
Полный сценарий, позволяющий просматривать записи, имеет следующий вид:
$ pg dbaseview
#!/bin/sh
#dbaseview
#просмотр записей
#игнорирование сигналов trap "" 2 3 15
#временные файлы
HOLD1=HOLD1.$$
DBFILE=DBFILE
continue_promptYN ()
{
#continue_prompt
_STR=$1
_DEFAULT=$2
#проверим, что параметры верны
if [ $# -lt 1 ]; then
echo "continue_prompt: I need a string to display"
return 1
fi
while :
do
echo -n "$_STR [Y..N] [$_DEFAULT]:"
read _ANS
: $'{_ANS:=$_DEFAULT)
if [ "$_ANS"="" ]; then
case $_ANS in
Y) return 0 ;;
N) return 1 ;;
esac
fi
case $_ANS in
у|Y|Yes|YES)
return 0;;
n|N|No|NO)
return 1;;
*) echo "Answer either Y or N, default ls $_DEFAULT";;
esac
done
}
display_rec() {
#diaplay_rec
#можно применить команду cat <<.
tput cup 5 3
echo "EMPLOYEE NO: $CODE"
echo "FIRST NAME : $F_NAME"
echo "SURNAME : $S_NAME"
echo "DEPARTMENT : $DEPART"
echo -e "nn"
}
no_recs () {
# no_recs
echo -e "nnSorry could not find a record with the name $STR"
}
get_rec () {
# get_rec
clear
echo -n "Enter the employee surname to view or all for all records:"
read STR
if [ "$STR"="q" ] ; then
return 1 fi
if [ "$STR"="all" ]; then # просмотр всех записей
echo "Surname Name Employee Code" echo"____________________________________"
cat $DBFILE |awk -F: '{print $2"t"$3"tt"$1}' | more
return 0
fi
REC=0
MATCH=no
if [ "$STR" != "" ]; then
while read CODE F_NAME S_NAME DEPART
do
REC=`expr $REC + 1`
tput cup 3 4
echo -n " searching record.. $REC" if [ "$S_NAME"="$STR" ]; then
# обнаружено имя
MATCH=yes
display_rec
break
else
continue
fi
done <$DBFILE
else
echo "Enter a surname to search for or q to quit"
fi
if [ "$MATCH"="no" ]; then
no_recs
fi
}
# главная программа
SAVEDIFS=$IFS
IFS=:
get_rec
if [ "$MATCH"="yes" ]; then
if continue_promptYN "Do You Wish To Print This Record" "N"; then
lpr << MAYDAY
RECORD No: $REC
EMPLOYEE NUMBER : $CODE
EMPLOYEE NAME : $F_NAME
EMPLOYEE SURNAME : $S_NAME
EMPLOYEE DEPARTMENT : $DEPART
MAYDAY
else
echo "No print of $S_NAME"
# не отображается fi # если желательно отображение
fi # если имеется совпадение
IFS=$SAVEDIFS
22.5. Заключение
Проверка достоверности данных, вводимых пользователем, играет важную роль. Однако для ее организации требуются некоторые дополнительные навыки. Вы имеете представление, какая вводимая информация помещается в запись, но в общем случае пользователи не располагают такими сведениями.
В среде программистов известно довольно старое изречение. Звучит оно примерно так: "Мусор на входе, мусор на выходе… кого это заботит, только б не было слишком поздно". Это означает, что если не проверять входные данные сценариев, в поток вывода может попасть ненужная информация.
ГЛАВА 23
Отладка сценариев
Одной из самых сложных задач при создании shell–сценариев является их отладка. Желательно, чтобы пользователь, выполняющий эту задачу, получил консультации на данном этапе. Чтобы избежать распространенных ошибок, достаточно следовать указанному ниже правилу.
Разбейте предлагаемый сценарий на задачи или процедуры, затем запрограммируйте и проверьте каждую процедуру и лишь потом переходите к следующему этапу.
В этой главе рассматриваются следующие темы: — распространенные ошибки; — применение команды set.
Действительно, ничто так не раздражает, как поиск ошибки, "спрятанной" глубоко в сценарии. Однако некоторый опыт написания сценариев поможет локализовать ошибку.
Чаще всего при написании сценариев пропускаются кавычки либо ключевое слово fi в конце конструкции if.
Следует учитывать, что если интерпретатор команд выдает сообщение о наличии ошибки в сценарии, нужно проанализировать не только строку, где может находиться ошибка, но также и блок кода, включающий эту строку. Интерпретатор shell не всегда точно указывает на местонахождение ошибки: сообщение об ошибке обычно появляется после выполнения строки с ошибочным оператором.
23.1. Наиболее распространенные ошибки
23.1.1. Ошибки, связанные с циклом
Если сообщение об ошибке появляется при выполнении конструкций for, while, until или case, то это может означать, что фактический блок инструкций некорректно определен. Возможно, было пропущено зарезервированное слово, требуемое в данной ситуации.
Ниже в сообщении об ошибке содержится слово "done", которое помогает разобраться в сути проблемы. Теперь пользователь знает, что нужно внести изменения в конструкцию while. При внимательном просмотре кода следует проверить наличие всех необходимых зарезервированных слов для конструкции while, например "do", или ключевого слова для применяемой условной конструкции.
syntax error near unexpected token 'done' line 31: 'done'
23.1.2. Как обычно пропускают кавычки
Второй распространенной ошибкой является элементарный пропуск кавычек. Обратите внимание на приведенный пример. Обычно приходится сталкиваться с большим количеством подобных примеров. Можно посоветовать еще раз изучить сценарий и проконтролировать наличие всех необходимых открывающих и закрывающих кавычек — unexpected EOF while looking for '""' line 36: syntax error
Если требуется настроить отображение сообщения об ошибке, содержащего номер ошибочной строки, то в этом случае обычно применяется опция set nu текстового редактора vi. Это удобно, если просмотр файлов осуществляется с помощью редактора vi. Для настройки отображаемых сообщений откройте окно редактора vi, затем нажмите клавишу [Esc] и введите двоеточие. После этого выполните команду set nu и нажмите клавишу [Return]. В результате этого происходит нумерация строк и можно перейти к той строке, где, по сообщению интерпретатора shell, содержится ошибка.
23.1.3. Проверка на наличие ошибки
Другой распространенной ошибкой является неправильное применение конструкции -eq. Обычно забывают указать число с какой‑либо стороны уравнения.
Если поступает сообщение об ошибке, которое приводится ниже, можно сделать вывод, что произошло одно из двух событий: либо между переменной и квадратной скобкой не указан пробел, либо в квадратных скобках пропущен оператор. Вероятнее всего, в данном случае ошибка связана с первым обстоятельством.
[: missing '] '
23.1.4. Регистр символов