22.3. Обновление записей
22.3. Обновление записей
При рассмотрении процесса удаления записи уже обсуждался код, приводящий к обновлению записи.
Когда обнаруживается корректная запись, все переменные поля записи с помощью переменной, выполняющей присваивание по умолчанию, назначаются переменной temp:
: [переменная, заданная по умолчанию:=переменная)
Пользователь может просто нажать клавишу [Return] для тех полей, значения которых изменять нежелательно. Затем переменная temp заменяется значением, заданным по умолчанию. Для выполнения произвольных обновлений можно просто вводить в соседние поля новые значения.
echo -n -e "EMPLOYEE NO: $C0DE "
echo -n "FIRST NAME : [$F_NAME] >"
read _F_NAME
: ${_FNAME:=$P_NAME}
Для реального обновления файла достаточно снова воспользоваться командой grep с опцией -v. Все записи обновляются по отдельности и перенаправляются во временный файл. Номер служащего задается в виде строки команды grep:
grep ~v $C0DE $DBFILE >$HOLD1
Пользователь получает запрос, нужно ли сохранять данную запись. Если ответ положителен, обновленная запись также добавляется во временный файл. Затем временный файл перемещается в исходный файл DEFILE.
echo "$CODE:$_F_NAME:$_S_NAME:$_DEPART" >> $HOLD1 mv $HOLD1 $DBFILE
После этого выполняется сортировка файла с помощью потока вывода, который сначала перенаправлялся во временный файл, затем перемещается обратно — в исходный файл DBFILE. Проверки кода завершения выполняются во время упомянутых действий с файлами, и пользователю выдаются сообщения об имеющихся затруднениях. Ниже показан поток вывода при обновлении записи.
Enter the employee surname :Penny
searching record.. 7
EMPLOYEE NO: 98211
FIRST NAME : Simon
SURNAME : Penny
DEPARTMENT : Services
ls this the record you wish to amend [Y..N] [Y]:
amending
EMPLOYEE NO: 98211
FIRST NAME : [Simon] >
SURNAME : [Penny] >
DEPARTMENT : [Services] >Accounts Ready to save this record [Y..N] [Y] :
Полный сценарий, выполняющий обновление записей:
$ pg dbasechange
#!/bin/sh
# dbasechange
• обновление записи
• игнорирование сигналов trap "" 2 3 15
• временные файлы DBFILE=DBFILE HOLD1=HOLD1.$$ HOLD2=HOLD2.$$
continue_promptYN()
{
• continue_jprompt _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 is $_DEFAULT";;
esac
done }
display_rec() {
• отображение_записи
• можно применить команду cat « документ, но нежелательно tput cup 5 3
echo "EMPLOYEE NO: $CODE" echo "FIRST NAME : $F_NAME" echo "SURNAME : $S_NAME" echo "DEPARTMENT : $DEPART" echo -e " " }
no_recs()
{
# no_recs
echo -e " Sorry could not find a record with the name $STR" }
get_rec ()
{
# get_rec
clear
echo -n "Enter the employee surname :"
read STR
if [ "$STR"="q" ]; then
return 1 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
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 "Is this the record you wish to amend" "Y"
then
echo "amending"
# нельзя изменить код служащего .
echo -n -e "EMPLOYEE NO: $CODE "
echo -n "FIRST NAME : [$F_NAME] >"
read _F_NAME
: ${_FNAME:=$F_NAME}
echo -n "SURNAME : [$S_NAME] >"
read _S_NAME
: ${_S_NAME:=$S_NAME}
echo -n "DEPARTMENT : [$DEPART] >"
read _DEPART
: ${_DEPART:=$DEPART}
grep -v $CODE $DBFILE >$HOLD1
if [ $? -ne 0 ]; then
echo "Problems creating temporary file..check it out"
exit 1
fi
if continue_promptYN "Ready to save this record" "Y"; then
echo "$CODE:$_F_NAME:$_S_NAME:$_DEPART" >> $HOLD1
mv $HOLD1 $DBFILE
if [ $? -ne 0 ]; then
echo "Problems moving temporary file…check it out"
fi
echo " Record Amended" # сортировка файла после изменений sort +2 -t: $DBFILE >$HOLD2 2> /dev/null
if [ $? -ne 0 ]; then
echo "problems trying to sort the file..check it out"
exit 1
fi
mv $HOLD2 $DBFILE if [ $? -ne 0 ]; then
echo "problems moving the temp sort file..check it out"
exit 1
fi
else
#если обновление прерывается
echo "Amend aborted"
exit 0
fi
else
# если не выполняется обновление
echo "no amending"
# нет удаления
fi
# если желательно удалить
fi
# если имеется совпадение
IFS=$SAVEDIFS