Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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
18.7.6. Выполнение суммирования
Довольно часто приходится сталкиваться с задачей считывания информации из файла и выполнения суммирования по определенным столбцам, содержащим числа. Предположим, в файле total.txt находятся данные о продажах отделами stat и gift..
$ pg total.txt
STAT
3444
GIFT
233
GIFT
252
GIFT
932
STAT
212
STAT
923
GIFT
129
Задача состоит в подсчете общей суммы всех записей отдела gift. Чтобы сохранить общие значения сумм, применим оператор expr. Как показано в следующем операторе expr, переменным loop и total первоначально вне цикла присваивается значение ноль. Когда сценарий выполняет цикл, значение переменной items добавляется к значению переменной total. В первую итерацию цикла входит только первый пункт, но в дальнейшем к накапливающимся значениям переменной total добавляются значения переменной items.
Следующий оператор expr увеличивает значение счетчика.
LOOP=0
TOTAL=0
while…
TOTAL=`expr $TOTAL + $ITEMS`
ITEMS=`expr $ITEMS + 1`
done
Очень распространенной является такая ошибка: при работе с оператором expr забывают сначала инициализировать переменную.
LOOP=0
TOTAL=0
Если переменная не инициализирована, на экране появится сообщение об ошибочном применении оператора expr. При необходимости можно инициализировать переменную в цикле:
TOTAL=`expr ${TOTAL:=0} + ${ITEMS}`
В вышеприведенном примере переменной total присваивается значение нуль, если эта переменная не имеет значения. Чаще распространен первый вариант инициализации переменных с помощью оператора expr. Не забывайте выводить на экран конечное общее значение, полученное в результате выполнения цикла.
Рассмотрим следующий сценарий.
$ pg total
#!/bin/sh
#общая сумма
#инициализация переменных
LOOP=0
TOTAL=0
COUNT=0
echo "items Dept"
echo " "
while read DEPT ITEMS do
# сохраните результаты подсчета при просмотре общих записей
COUNT=`expr $COUNT + 1`
if [ "$DEPT"="GIFT" ]; then
# сохраните выполнение суммирования TOTAL=`expr $TOTAL + $ITEMS` ITEMS=`expr $ITEMS + 1`
echo -e "$ITEMSt$DEPT"
fi
#echo $DEPT $ITEMS done < total.txt
echo $TOTAL
echo "There were $COUNT entries altogether in the file"
При выполнении сценария получим:
$ total
Items
Dept
234
GIFT
253
GIFT
933
GIFT
130
GIFT
======
======
1546
There were 7 entries altogether in the file
18.7.7. Одновременный просмотр двух записей
В некоторых случаях возникает необходимость в одновременной обработке двух записей, например, если нужно сравнить различные поля двух записей. Чтобы просматривать одновременно по две записи, достаточно после первой конструкции "while read" поместить оператор "do" с другим оператором "read". Применяя эту методику, следует помнить, что количество записей для просмотра составляет четное число. Не забывайте проверять число просматриваемых записей!
Ниже приводится файл, содержащий шесть записей: record1, record2 и т. д.
$ pg record.txt
record 1
record 2
record 3
record 4
record 5
record 6
В этом примере одновременно просматривается по две записи. Никакой проверки записей в примере не производится.
Ниже приводится соответствующий сценарий.
$ pg readpair
#!/bin/sh
#readpair
#первая запись
while read rec1 do
#вторая запись
read rec2
#выполняется дальнейшая обработка/тестирование для тестирования или
#сравнения обеих записей
echo "This ls record one of a pair :$rec1"
echo "This ls record two of a pair :$rec2"
done < record.txt
С помощью команды wc сначала проверим, что было выполнено четное число записей.
$ cat record.txt | wc -l
б
Имеется шесть записей, поэтому приступим к их обработке.
$ readpair
This ls record one of a pair :record 1
This ls record two of a pair :record 2
This ls record one of a pair :record 3
This ls record two of a pair :record 4
This ls record one of a pair :record 5
This ls record two of a pair :record 6
18.7.8. Игнорирование символа #
При просмотре текстовых файлов возникает необходимость игнорировать или пропускать строки комментария. Ниже приводится типичный пример.
Предположим, что с помощью обычного цикла while просматривается файл конфигурации. Обычно выполняется построчный просмотр.
Однако с помощью оператора case можно игнорировать некоторые строки, начинающиеся с определенных символов. Поскольку символ # является специальным, для его отключения используется символ ""; затем после символа хэша указывается звездочка, что позволит после хэша размещать любые символы.
Ниже приводится типичный файл конфигурации.
$ pg config
#ЭТО КОНФИГУРАЦИОННЫЙ ФАЙЛ ПОДСИСТЕМЫ АУДИТА
#НЕ РЕДАКТИРУЙТЕ ЕГО! ОН РАБОТАЕТ
#
# задание административного доступа
AUDITSCM=full
#местонахождение подсистем
AUDITSUB=/usr/opt/audit/sub
#серийный номер хэша для продукта
HASHSER=12S90AB3
#КОНЕЦ ФАЙЛА КОНФИГУРАЦИИ!!!
#
Ниже приводится сценарий, где игнорируются символы хэша:
$ pg ignore_hash
#!/bin/sh
# игнорируйте_хэш
INPUT_FILE=config
if [ -s $INPUT_FILE ]; then
while read LINE
do
case $LINE in
#*) ;; # игнорировать все символы хэша
*) echo $LINE
;;
esac
done < $INPUT_FILE
else
echo "`basename $0` : Sorry $INPUT_FILE does not exist or ls empty"
exit 1
fi
При выполнении получим:
$ ignore_hash
AUDITSCM=full
AUDITSUB=/usr/opt/audit/sub
HASHSER=12890AB3
18.7.9. Работа с форматированными отчетами
Обычно удаление нежелательных строк целесообразно при просмотре файла отчета. Ниже приводится часть отчета, перечисляющая заказ на канцелярские товары. В данном случае представляют интерес столбцы, содержащие уровень переупорядочения пункта и текущий уровень. Ниже приводится сам отчет.
$ pg order
RE‑ORDER REPORT
ITEM
ORDERLEVEL
LEVEL
Pens
14
12
Pencils
15
15
Pads
7
3
Disks
3
2