Выбрать главу

if continue_promptYN "Do You Wish To DELETE This Record" "N"; then

echo "DEL"

grep -v $STR DBFILE >$HOLD1 2> /dev/null

if [ $? -ne 0 }; then

echo "Problems creating temp file $HOLD1.. check it out"

exit 1 fi

Удаление записи выполняется выполнением команды grep с опцией -v. В этом случае с помощью строки STR отображаются все несовпадающие поля. (Эта строка содержит фамилию, которая запрашивается пользователем при удалении записи.)

Поток данных вывода для команды grep перенаправляется во временный файл, где выполняется сортировка. Затем временный файл заменяет исходный файл DBFILE.

При реализации всех перемещений данных выполняется проверка с помощью кода завершения последней команды. Ниже показан поток вывода при удалении записи:

Enter the employee surname :Wilson

searching record,. 6

EMPLOYEE NO: 69232 FIRST NAME : Louise SURNAME : Wilson DEPARTMENT : Accounts

Do You Wish To DELETE This Record [Y..N] [N] :

А теперь приведем полный сценарий, выполняющий удаление записи:

$ pg dbase_del

#!/bin/sh

#dbase_del

#удаление записи

#перехват сигналов

trap "" 2 3 15

#Файл данных

DBFILE=DBFILE

#временные файлы

HOLD1=HOLD1.$$

HOLD2=HOLD2.$$

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 is $_DEFAULT"

esac

done

}

display_rec()

{

#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 "\n\n"

}

no_recs () {

# no_recs

echo -e "\n\nSorry 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`

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 DELETE This Record" "N"; then echo "DEL"

grep -v $STR DBFILE >$HOLD1 2> /dev/null if [ $? -ne 0 ]; then

echo "Problems creating temp file $HOLD1..check it out" exit 1 fi

mv $HOLD1 DBFILE if [ $? -ne 0 ]; then

echo "Problems moving temp file..check it out" exit 1 fi

# сортировка файла после изменений

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 "no deletion"

# удаление отсутствует

fi # если нужно удалить

fi # если совпадает

# восстановление установок IFS IFS=$SAVEDIFS

22.3. Обновление записей

При рассмотрении процесса удаления записи уже обсуждался код, приводящий к обновлению записи.

Когда обнаруживается корректная запись, все переменные поля записи с помощью переменной, выполняющей присваивание по умолчанию, назначаются переменной temp:

: [переменная, заданная по умолчанию:=переменная)

Пользователь может просто нажать клавишу [Return] для тех полей, значения которых изменять нежелательно. Затем переменная temp заменяется значением, заданным по умолчанию. Для выполнения произвольных обновлений можно просто вводить в соседние поля новые значения.

echo -n -e "EMPLOYEE NO: $C0DE\n"

echo -n "FIRST NAME : [$F_NAME] >"

read _F_NAME

: ${_FNAME:=$P_NAME}

Для реального обновления файла достаточно снова воспользоваться командой grep с опцией -v. Все записи обновляются по отдельности и перенаправляются во временный файл. Номер служащего задается в виде строки команды grep:

grep ~v $C0DE $DBFILE >$HOLD1

Пользователь получает запрос, нужно ли сохранять данную запись. Если ответ положителен, обновленная запись также добавляется во временный файл. Затем временный файл перемещается в исходный файл DEFILE.