Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
characters()
#characters
#$1=string
{
_LETTERS_ONLY=$1
_LETTERS_ONLY=`echo $1|awk '{if($0~/[^a‑zA‑Z]/) print "l"}'`
if [ "$_LETTERS_ONLY" != "" ]
then
return 1 else
return 0 fi
}
При просмотре полей можно просто вызвать необходимую функцию и затем проверить коды возврата.
Чтобы сообщения находились на экране до тех пор, пока пользователь не нажмет на клавишу для их удаления, нужно воспользоваться командным приглашением. Следующая функция реализует командное приглашение read_a_char.
continue_promptYN() {
# continue_prompt
echo -n "Hit any key to continue.."
DUMMY=`read_a_char`
}
Когда вводятся данные пользователя, содержащие номер служащего, нужно убедиться, что ранее подобная информация не вводилась. Поле должно быть уникальным. Существует несколько способов для выполнения этой задачи; в данном случае применяется команда grep. С помощью команды grep выполняется поиск номера служащего, который содержится в строке _CODE. Если утилита awk не возвращает какого‑либо значения, то дублирующиеся значения отсутствуют и функция завершает выполнение с кодом возврата 0. Ниже приводится код этой функции. (Обратите внимание, что для нахождения точного соответствия в команде grep используется выражение "$_CODE>". Двойные кавычки служат для сохранения значения переменной; при использовании одинарных кавычек ничего возвращаться не будет.)
check_duplicate() {
#check_duplicate
#проверка дубликата номера служащего
_CODE=$1
MATCH="grep "$_CODE>" $DBFILE"
echo $_CODE
if [ "$MATCH"="" ]; then
return 0 # нет дублирования
else
return 1 # дубликат найден
fi
}
Ниже приводится часть программного кода, выполняющая проверку номера
служащего. Функционирование этого программного кода объясняется дальше.
while : do
echo -n "Employee Staff Number :"
read NUM
# проверка вводимых данных
if [ "$NUM" != "" ]; then
if a_number $NUM; then
# номер OK
NUM_PASS=0
else
NUM_PASS=1
fi
if length_check $NUM 10; then
# длина OK
LEN_PASS=0
else
LEN_PASS=1
fi
# проверка наличия дубликатов…
if check_duplicate $NUM; then
# нет дубликатов
DUPLICATED=0
else
DUPLICATED=1
echo "Staff Number: There ls already an employee with this number"
continue_prompt
fi
# проверка значений всех трех переменных; все они должны выполняться
if [ "$LEN_PASS"="0" -a "$NUM_PASS"="0" -a "$DUPLICATE"="0" ]
then
break
else
echo "Staff Number: Non‑Numeric or Too Many Numbers In Field" continue_prompt
fi
else
echo "Staff Number: No Input Detected, This Field Requires a Number" continue_prompt
fi
done
Вся информация обрабатывается в цикле while (фактически, каждое поле, содержащее записи данных, обрабатывается в отдельном цикле while). Поэтому, если имеется недействительная запись, последует запрос о просмотре ее исходного значения.
После просмотра номера служащего проверяется, содержатся ли в поле некоторые данные:
if [ "$NUM" != "" ]
Если поле не содержит данные для ввода, не выполняется часть then конструкции if. В части else, которая завершает код подтверждения поля, отображается следующее сообщение:
Staff Number: No Input Detected, This Field Requires a Number
Часть then производит все необходимые проверки правильности вводимых данных. При условии, что имеются вводные данные, вызывается функция a_number. Эта функция проверяет, содержит ли передаваемая строка числовые данные; если это так, функция возвращает значение 0, в противном случае возвращается значение 1, На базе возвращаемых значений флагу num_pass присваивается либо значение о (успешный возврат — наличие строки из чисел), либо значение 1 (неудачный возврат -cтрока не является числовой).
Затем вызывается функция length check. Эта функция передает не только строку, но и максимальное число символов, содержащихся в строке. В данном случае передается десять символов. Если количество символов меньше или равно максимальной величине, отображается значение 0; иначе возвращается значение 1. Флаг len_PASS принимает либо значение 0 (в случае успешного возврата, когда длина строки не превышает максимального значения), либо значение 1 (при неудачном возврате, если получена строка, длина которой равна максимальному значению).
Проверим, имеются ли дубликаты для номеров служащих. Эту задачу выполняет функция check_duplicate. Если дубликаты не обнаружены, флагу DUPLICATE присваивается значение 1. Теперь нужно убедиться, что все три флага имеют значение 0 (ошибки отсутствуют). Для этого воспользуемся логической функцией and. При выполнении части then обе части уравнения должны принять истинное значение.
Если проверка завершилась успешно, значение поля подтверждается. Поскольку цикл while выполняется непрерывно, следует с помощью команды break прервать его выполнение.
if [ "$LEN_PASS" = "0" -a "$NUM_PASS" = "0" -a "$DUPLICATE" = "0"]; then
break
Если при выполнении подтверждения какой‑либо части (например, при проверке длины строки или наличия только числовых значений) возникает ошибка, то в нижней части экрана отображается соответствующее сообщение.
Staff Number: Non‑Numeric or Too Many Numbers In Field
Действительно, значение одного поля подтверждается.
Чтобы подтвердить второе и третье поля, осуществляется аналогичный процесс. Часть, отвечающая за подтверждение, содержится в другом непрерывно выполняющемся цикле while. При этом вызывается функция characters. Эта функция проверяет, содержатся ли в поле только символы. Ниже приводится фрагмент кода, в котором выполняется подтверждение имени:
while : do
echo -n "Employee's First Name :"
read F_NAME
if [ "$F_NAME" != "" ]; then
if characters $F_NAME; then
F_NAME_PASS=0
else
F_NAME_PASS=1
fi
if length_check $F_NAME 20; then
LEN_PASS=0 else
LEN_PASS=1
fi
if [ "$LEN_PASS"="0" -a "$F_NAME_PASS"="0" ]; then
break
else
echo "Staff First Name: Non‑Character or Too Many Characters In Field"
continue_prompt
fi
else
echo "Staff First Name: No Input Detected, This Field Requires Characters" continue_prompt
fi
done
Для подтверждения названия отдела (обратите внимание на приведенный ниже листинг) применяется конструкция case. Компания имеет пять отделов, а поле содержит только одно название. Обратите внимание, что названию каждого из отделов соответствуют три различных шаблона. Благодаря этому можно точно установить название отдела, если пользователь не помнит его наименование. Если совпадение с шаблоном найдено, пользователь прерывает выполнение конструкции case. Другие вводные данные перехватываются, в результате чего отображается список имеющихся отделов.
while :
do
echo -n "Company Department :"
read DEPART
case $DEPART in
ACCOUNTS|Accounts|accounts) break;;
SALES|Sales|sales) break;;
IT|It|it) break;;
CLAIMS|Claims|claims) break;;
SERVICES|Services|services) break;;
*) echo "Department: Accounts, Sales, IT, Claims, Services";;
esac
done
Когда все поля подтверждены, отображается приглашение с вопросом, следует ли сохранять эту запись. С этой целью применяется функция continue_promptYN, к которой мы уже обращались ранее, используя Y или N в качестве ответа. Если пользователь нажимает клавишу [Return], можно также передать ответ, заданный по умолчанию.