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.