18.7.5. Обработка файла с помощью проверок условий
18.7.5. Обработка файла с помощью проверок условий
Большинство циклов while включает некоторый оператор проверки, который уточняет последовательность действий.
Ниже рассматривается файл с именами служащих, и на экран выводятся подробности. После обнаружения имени служащего "James Lenod" сценарий завершает работу. Вывод на экран подробностей до осуществления проверки позволяет удостовериться, что "James Lenod" добавляется в содержимое файла.
Обратите внимание, что все переменные задаются в начале сценария. При внесении небольших поправок в переменные можно сэкономить рабочее время и
сократить количество типов. Все редакторские правки находятся в начале, а не рассеяны по всему сценарию.
$ pg whileread_file
#!/bin/sh
#whileread_file
#инициализация переменных
SAVEDIFS=$IFS
IFS=:
HOLD_FILE=hold_file
NAME_MATCH="James Lenod"
INPUT_FILE=names.txt
# создавайте каждый раз новый HOLD_FILE, в случае, когда сценарий
непрерывно выполняется
>$HOLD FILE
while read NAME DEPT ID
do
#выводит на экран всю информацию в holdfile с помощью перенаправления
echo $NAME $DEPT $ID >>$HOLD_FILE
#имеется ли соответствие ???
if [ "$NAME"="$NAME_MATCH" ]; then
# да, тогда удобно завершить работу
echo "all entries up to and including $NAME_MATCH are in $HOLD_FILE"
exit 0
fi
done < $INPUT_FILE
# восстановление IFS
IFS=$SAVEDIFS
Выполним следующий шаг и уточним количество служащих в каждом из отделов. Сохраним прежний формат просмотра, в котором каждому полю присваивается название переменной. Затем для добавления каждого совпадения с помощью оператора case просто применим команду expr. Если обнаруживается неизвестный отдел, его название выводится на экран в виде стандартного потока ошибок; поэтому, если отдел не существует, нет необходимости прерывать выполнение сценария.
$ pg whileread_cond
#!/bin/sh
# whileread_cond
# инициализация переменных ACC_LOOP=0; CUS_LOOP=0; PAY_LOOP=0;
SAVEDIFS=$IFS
IFS=:
while read NAME DEPT ID
do
# счетчик увеличивается на единицу для каждого совпадающего названия отдела.
case $DEPT in
Accounts)
ACC_LOOP=`expr $ACC_LOOP + 1`
ACC="Accounts"
;;
Customer)
CUS_LOOP=`expr SCUS_LOOP + 1`
CUS="Customer"
;;
Payroll)
PAY_LOOP=`expr $PAY_LOOP + 1`
PAY="Pay roll"
;;
*) echo "`basename $0`: Unknown department $DEPT" >&2
;;
esac
done < names.txt
IFS=$SAVEDIFS
echo "there are $ACC_ LOOP employees assigned to $ACC dept"
echo "there are $CUS_LOOP employees assigned to $CUS dept"
echo "there are $PAY_LOOP employees assigned to $PAY dept"
При выполнении сценария получим следующий вывод:
$ whileread_cond
there are 2 employees assigned to Accounts dept
there are 1 employees assigned to Customer dept
there are 2 employees assigned to Payroll dept