Чтение онлайн

ЖАНРЫ

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

Поделиться с друзьями: