Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Если пользователь выбирает N, производится просмотр блоков кода в конструкции if и выполнение сценария завершается. При вводе пользователем большого числа записей следует применить функцию, которая добавляет записи в теле цикла while. Тогда после добавления записи возврат в меню не происходит, а выполнение сценария не завершается.
Если пользователь выбирает Y, запись сохраняется. Для добавления записи в файл применяется следующий код:
echo "$NUM:$F_NAME:$S_NAME:$DEPART" >> $DBFILE
Пользователь получает сообщение о том, что запись сохраняется в файле; при этом команда sleep приостанавливает выполнение сценария на одну секунду. Именно за это время пользователь сможет просмотреть сообщение.
Разделителем поля служит двоеточие. Затем файл сортируется по полю, содержащему фамилию, а поток вывода направляется в файл temp. После этого файл перемещается назад, в исходный файл DEFILE. Во время перемещений файла выполняется проверка кода завершения. При появлении каких‑либо затруднений пользователь получает соответствующее сообщение.
Вот как выглядит поток данных вывода в случае добавления записи:
ADD A RECORD
Employee Staff Number : 23233
Employee's First Name : Peter
Employee's Surname : Wills
Company Department : Accounts
Do You wish To Save This Record [Y..N] [Y]:
saved
А теперь обратите внимание, какой вид имеет файл DBFILE после добавления нескольких записей:
$ pg DBFILE
32123:Liam:Croad:Claims 2399:Piers:Cross:Accounts 239192:John:Long:Accounts 98211:Simon:Penny:Services 99202:Julie:Sittle:XT 23736:Peter:Wills:Accounts 89232:Louise:Wilson:Accounts 9l811:Andy:Wools:IT
Ниже приодится полный сценарий, выполняющий добавление записи:
$ pg dbase_add
#!/bin/sh
#dbase_add
#добавление записи
#игнорирование сигналов
trap "" 2 3 15
#файл temp содержит файлы
DBFILE=DBFILE
HOLD1=HOLD1.$$
read_a_char ()
#read_a_char
#сохранение установок
SAVEDSTTY=`stty -g`
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -cbreak
stty $SAVEDSTTY
}
continue_promptYN()
#вызов: continue_prompt "string to display" default_answer
{
# 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|Y|Yes|YES)
return 0 ;;
n|N|No|NO)
return 1 ;;
*) echo "Answer either Y or N, default ls $_DEFAULT" ;;
esac
echo $_ANS
done
)
continue_prompt() {
# continue_prompt
echo -n "Hit any key to continue.."
DUMMY=`read_a_char`
}
length_check ()
# length_check
# $1=строка для проверки длины $2=максимальная длина
_STR=$1
_МАХ=$2
_LENGTH=`echo $_STR | awk '{print length ($0)}`
if [ "$_LENGTH" -gt "$_MAX" ]; then
return 1 else
return 0 fi
}
a_number()
(
#a_number
#вызов: a_number $1=number _NUM=$1
_NUM=`echo $1|awk '{if($0~/[^0-9]/) print "1"}'`
if [ "$_NUM" != "" ]
then
# ошибки
return 1
else
return 0
fi
}
characters()
#characters
#вызов: char_name string {
_LETTERS_ONLY=$1
_LETTERS_ONLY=`echo $1 | awk '{if ($0~/[^a‑zA‑Z]/) print "1")'`
if [ "$_LETTERS_ONLY" != "" ]
then
# ошибки
return 1
else
# содержит только символы
return 0
fi
}
check_duplicate() {
#check_duplicate
#проверка дублирования номера служащего
#для вызова: check_duplicate строка _CODE=$1
MATCH=`grep "$_CODE>" $DBFILE`
echo $_CODE
if [ "$MATCH"="" ]; then
return 0 # нет дубликата
else
return 1 # дубликат обнаружен
fi
}
add_rec()
{
# add_rec
# == STAFF NUMBER
while :
do
echo -n "Employee Staff Number :"
read NUM
if [ "$NUM" != "" ]; then
if a_number $NUM; then
NUM_PASS=0
else
NUM_PASS=1
fi
if length_check $NUM 10; then
LEN_PASS=0
else
LEN_PASS=1
fi
# проверка наличия дубликатов… if check_duplicate $NUM; then
DUPLICATED=0
else
DUPLICATE=1
echo "Staff Number: There ls already a 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 :
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
# oбa условия должны быть истинными для выхода из этого цикла 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
# == Фамилия
while :
do
echo -n "Employee's Surname :"
read S_NAME
if [ "$S_NAME" != "" ]; then if characters $S_NAME; then
$_NAME_PASS=0
else
$_NAME_PASS=1
fi
if length_check $S_NAME 20; then
LEN_PASS=0
else
LEN_PASS=1
fi
if [ "$LEN_PASS"="0" -a "$S_NAME_PASS"= "0" ]; then
break else
echo "Staff Surname: Non‑Character or Too Many Characters In Field" continue_prompt fi else
echo "Staff Surname: No Input Detected, This Field Requires Characters" continue_prompt fi done
# == Отдел
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 )
# основная программа
clear
echo -e "tttADD A EMPLOYEE RECORD"
if [ -s $DBFILE ]; then :
else
echo "Information: Creating new file to add employee records"
>$DBFILE fi
add_rec if continue_promptYN "Do You wish To Save This Record " "Y"; then
echo "$NUM:$F_NAME:$S_NAME:$DEPART" >> $DBFILE
echo "record saved"
sleep 1
sort +2 -t: $DBFILE > $HOLD1 2> /dev/nuil
if [ $? -ne 0 ]; then
echo "problems trying to sort the file..check it out"
exit 1 fi