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

ЖАНРЫ

Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:

$ pg forcount

#!/bin/sh # forcount counter=0

for files in *

do

# increment

counter=`expr $COUNTER + 1`

done

echo "There are $COUNTER files in `pwd` we need to process"

$ forcount

There are 45 files in /apps/local we need to process

Аналогичный результат можно получить с помощью команды wc.

$ ls |wc -l

45

18.5.10. Циклы for для обработки документов

С циклом for можно комбинировать любые команды. В приведенном примере переменная содержит имена всех зарегистрированных пользователей. Для реализации этой конструкции обращаются к команде who и утилите awk. Затем цикл for обрабатывает имена этих пользователей и каждому высылает электронное сообщение. При отправке сообщения используется конструкция "документ здесь".

$ pg formallit

#!/bin/sh

# formallit

WHOS_ON=`who -u | awk '{print $1}'`

for user in $WHOS_ON

do

mail $user << MAYDAY

Dear Colleagues,

It's my birthday today, see you down the

club at 17:30 for a drink.

See ya.

$LOGNAME

MAYDAY

done

Ниже приводится электронное сообщение для данного сценария.

$ pg mbox

Dear Colleagues,

It's my birthday today, see you down the

club at 17:30 for a drink.

See ya. dave

18.5.11. Вложенные циклы for

Чтобы вложить, циклы, достаточно цикл for поместить в другой цикл:

for имя_переменной in list

do

for имя_переменной2 in list2

do

команда1

done

done

В следующем сценарии представлен вложенный цикл for. Имеются два списка, APPS и SCRIPTS, первый из которых содержит путь к приложениям на сервере, а второй включает административные сценарии, которые выполняются для каждого приложения. Для каждого приложения из списка apps имеется соответствующее название сценария в списке SCRIPTS. Обычно сценарии выполняются в фоновом режиме (с помощью указания префикса &). Данный сценарий посредством команды tee размещает также запись в журнальном файле, поэтому наряду с файлом на экране отображается поток выходных данных. Обратите внимание на выходные данные, чтобы понять, как цикл for использует список SCRIPTS при обработке элементов списка apps.

$ pg audit_run

#!/bin/sh

# audit_run

APPS="/apps/accts /apps/claims /apps/stock /apps/serv"

SCRIPTS="audit.check report.run cleanup"

LOGFILE=audit.log

MY_DATE=`date +%H:%M" on "%d/%m%Y`

# внешний цикл

for loop in $APPS

do

# внутренний цикл

for 1оор2 in $SCRIPTS

do

echo "system $LOOP now running $LOOP2 at $MY_DATE" | tee -a $LOGFILE

$LOOP $LOOP2 &

done

done

$ audit_run

system /apps/accts now running audit.check at 20:33 on 23/051999

system /apps/accts now running report.run at 20:33 on 23/051999

system /apps/accts now running cleanup at 20:33 on 23/051999

system /apps/claims now running audit.check at 20:33 on 23/051999

system /apps/claims now running report.run at 20:33 on 23/051999

system /apps/claims now running cleanup at 20:34 on 23/051999

system /apps/stock now running audit.check at 20:34 on 23/051999

system /apps/stock now running report.run at 20:34 on 23/051999

system /apps/stock now running cleanup at 20:34 on 23/051999

system /apps/serv now running audit.check at 20:34 on 23/051999

system /apps/serv now running report.run at 20:34 on 23/051999

system /apps/serv now running cleanup at 20:34 on 23/051999

18.6. Цикл until

Цикл until позволяет выполнять ряд команд, пока условие остается истинным. Практически цикл until противоположен по смыслу циклу while. Цикл while является более предпочтительным, но в определенных случаях цикл until лучше справляется с работой. Формат цикла until:

until условие

команда1

done

В качестве условия выступает любое действительное проверочное условие. Проверка производится в конце цикла, поэтому в любом случае цикл выполняется однократно — не забывайте об этом обстоятельстве. А теперь рассмотрим несколько примеров.

18.6.1. Простой цикл until

Этот сценарий непрерывно ищет пользователя "root" и выполняет команду who. Результат выполнения команды grep содержится в переменной IS_ROOT.

Если пользователь "root" обнаружен, цикл завершает обработку. Затем пользователю simon направляется электронное сообщение, в котором отмечается, что пользователь "root" зарегистрирован. Обратите внимание на применение команды sleep, которая довольно часто используется в циклах until. Эта команда дает возможность приостановить выполнение цикла на несколько секунд, что позволяет указать дополнительные команды.

$ pg until_who

#!/bin/sh

# until_who

ls_ROOT=`who | grep root`

until [ "$IS_ROOT" ]

do

sleep 5

done

echo "Watch it. roots in " | mail simon

18.6.2. Контроль наличия файла

В этом примере в цикле until выполняется команда "sleep 1" до тех пор, пока не будет удален файл под именем /tmp/monitor. LCK. После удаления файла сценарий продолжает выполняться в обычном режиме.

$ pg until_lck

#!/bin/sh

# until_lck

LOCK_FILE=/trap/process. LCK

until [ ! — f $1OCK_FILE ]

do

sleep 1 done echo "file deleted "

# обычная обработка, файл имеется

В приведенном примере показан один из методов, обеспечивающий совместную работу сценариев при выполнении.

В данном случае речь идет об одном из методов взаимодействия сценариев. Предположим, что другой сценарий, например process_main, используется для сбора информации со всех компьютеров локальной сети и размещения этих данных в файле отчета.

Когда выполняется сценарий process_main, создается файл lck (файл блокировки). Приведенный выше сценарий получает информацию, собранную сценарием process_main. Однако он не обрабатывает файл, если сценарий process_main продолжает обновление файла отчета.

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