Шрифт:
Пользователь получает сообщение о том, что запись сохраняется в файле; при этом команда 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