Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
Чтобы устранить эти затруднения, сценарий process_main создает файл lck при запуске и удаляет его при завершении работы.
Рассматриваемый сценарий ожидает удаления файла LCK. После того как файл lck удален, сценарий может обрабатывать содержимое файла отчета.
18.6.3. Мониторинг дисковой памяти
Цикл until также полезно применять для контроля состояния системы. Предположим, что необходимо уточнить пространство, занимаемое файлами на диске, и направить пользователю "root" электронное сообщение по достижении определенного уровня.
В следующем сценарии просматривается система файлов /logs. С помощью утилиты awk и команды grep информация постоянно извлекается из переменной $LOOK_out. Значения этой переменной характеризуют объем, занимаемый системой файлов /logs.
Если занятый объем превышает 90%, опция command запускает триггер, пользователю "root" направляется сообщение и сценарий завершает работу. Сценарий следует завершить, поскольку в противном случае, если условие истинно (например, занятый объем по–прежнему превышает 90%(, электронное сообщение пользователю "root" будет высылаться непрерывно.
$ pg until_mon
#!/bin/sh
#until_ mon
# получите столбец со значениями процентов и удалите заголовок строки из df
LOOK_OUT=`df | grep /logs | awk '{print $5}' | sed 's/%//g'`
echo $LOOK_OUT
until [ "$LOOK_OUT" -gt "90" ]
do
echo "Filesystem..logs ls nearly full" | mail root
done
exit 0
18.7. Цикл while
Цикл while выполняет ряд команд до тех пор, пока истинно условие. Этот цикл используется также для просмотра данных из файла ввода. Формат цикла while:
while команда
do
команды1
команды2
done
Между конструкциями while и do находится несколько команд, хотя в общем случае применяется только одна команда. Обычно команда выполняет проверку условия.
Команды, размещенные между ключевыми словами do и done, выполняются только в том случае, если код завершения command равен нулю; если код завершения принимает какое-либо другое значение, цикл заканчивается.
Когда команды выполнены, контроль передается обратно, в верхнюю часть цикла. И все начинается снова до тех пор, пока проверяемое условие отлично от нуля.
18.7.1. Простой цикл while
Ниже приводится основная форма цикла while. Условие тестирования состоит в том, что если "COUNTER is less than 5", условие останется истинным. Переменная counter имеет начальное значение нуль, и ее значение увеличивается на постоянную величину при выполнении цикла.
$ pg whilecount
#!/bin/sh # whilecount COUNTER=0
#счетчик равен 5?
while [ $COUNTER -lt 5 ] do
#прибавление к счетчику единицы
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done
Указанный сценарий выводит на экран числа от 1 до 5, затем завершает работу.
$ whilecount
1 2 3
4
5
18.7.2. Применение цикла while при вводе с клавиатуры
Цикл while может применяться для ввода информации с клавиатуры. В следующем примере введенная информация присваивается переменной film. Если нажать клавиши [Ctrl+D], цикл завершает выполнение.
$ pg whileread
#!/bin/sh
# whileread
echo " type <CTRL-D> to terminate"
echo -n "enter your most liked film :"
while read FILM
do
echo "Yeah, great film the $FILM"
done
Когда сценарий выполняется, вводимыми данными могут быть:
$ whileread
enter your most liked film: Sound of Music
Yeah, great film the Sound of Music
<CTRL-D>
18.7.3. Применения цикла while для считывания данных из файлов
Обычно цикл while используется для считывания данных из файла, что позволяет сценарию обрабатывать информацию.
Предположим, что следует просмотреть информацию из следующего персонального файла, содержащего имена служащих, их ID и названия отделов.
$ pg names.txt
Louise Conrad:Accounts:ACC8987
Peter James:Payroll:PR489
Fred Terms:Customer:CUS012
James Lenod:Accounts:ACC887
Frank Pavely:Payroll:PR489
Для хранения строк данных можно использовать переменные. Условие истинно до тех пор, пока не считываются новые данные. Для просмотра содержимого файла цикл while использует перенаправление потока данных ввода. Обратите внимание, что отдельной переменной $LINE присваивается целая строка.
$ pg whileread
#!/bin/sh
# whileread
while read LINE
do
echo $LINE
done < names.txt
$ whileread
Louise Conrad:Accounts:ACC8987
Peter James:Payroll:PR489
Fred Terras:Customer:CUS012
James Lenod:Accounts:ACC887
Frank Pavelу:Payroll:PR4 8 9
18.7.4. Считывание данных из файлов с помощью IFS
Чтобы при выводе данных устранить разделитель полей в виде двоеточия, примените переменную ifs, предварительно сохранив ее установки. После того как сценарий завершит работу с этими установками, восстановите установки переменной ifs. С помощью переменной ifs можно изменить разделитель полей на двоеточие вместо пробела или символа табуляции, которые заданы по умолчанию. Как известно, отдельной переменной можно присвоить значения трех полей: NAME, dept и id.
Чтобы улучшить внешний вид записей, немного увеличивая поля, можно с помощью команды echo применить символы табуляции. Рассмотрим сценарий:
$ pg whilereadifs
#!/bin/sh
#whilereadifs
#сохраните установку IFS
SAVEDIFS=$IFS
#присвоим переменной IFS новый разделитель
IFS=:
while read NAME DEPT ID
do
echo -e "$NAME\t $DEPT\t $ID" done < names.txt
# восстановим установки переменнойIFS
IFS=$SAVEDIFS
При выполнении сценария получим более привлекательный поток вывода: