Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
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\n"
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
22.4. Просмотр записей
Пользователь может просматривать как все записи, так и отдельную запись. Если пользователь желает просмотреть все записи, достаточно воспользоваться конструкцией cat и awk. Если в запись входит большое количество полей, требуется более дружественный для пользователя вывод данных. Однако такой подход может негативно сказаться на других свойствах сценария.
if [ "$STR"="all" ]; then
echo "Surname Name Employee Code"
echo "______________________________"
cat $DBFILE | awk -F: '{print $2"\t"$3"\t\t"$1}' | more
return 0
fi
При рассмотрении процесса удаления и обновления записей рассматривался код, приводящий к отображению отдельной записи. Небольшое изменение кода связано с тем, что при выборе пользователем этой опции, запись выводится на экран. Ниже приводится часть кода, который позволяет пересылать запись на принтер:
pg << MAYDAY
RECORD No : $REC
EMPLOYEE NUMBER : $CODE
EMPLOYEE NAME : $F_NAME
EMPLOYEE SURNAME : $S_NAME
EMPLOYEE DEPARTMENT : $DEPART
MAYDAY
Вот как выглядит поток вывода при просмотре записи:
Enter the employee surname to view or all for all records:Wilson searching record… 8
EMPLOYEE NO
89232
FIRST NAME
Peter
SURNAME
Wilson
DEPARTMENT
IT
Do You Wish To Print This Record [Y..N] [N] :
Полный сценарий, позволяющий просматривать записи, имеет следующий вид:
$ pg dbaseview
#!/bin/sh
#dbaseview
#просмотр записей
#игнорирование сигналов trap "" 2 3 15
#временные файлы
HOLD1=HOLD1.$$
DBFILE=DBFILE
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 ls $_DEFAULT";;
esac
done
}
display_rec {
#diaplay_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 to view or all for all records:"
read STR
if [ "$STR"="q" ] ; then
return 1 fi
if [ "$STR"="all" ]; then # просмотр всех записей
echo "Surname Name Employee Code" echo"____________________________________"
cat $DBFILE |awk -F: '{print $2"\t"$3"\t\t"$1}' | more
return 0
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