copying arrows to arrows.bak
copying center to center.bak
copying center1 to center1.bak
18.5.7. Массовое преобразование
Чтобы найти все файлы, которые начинаются символами "LPSO", и преобразовать их содержимое в символы верхнего регистра, используются команды ls и cat. Команда ls отображает список файлов, а команда cat применяется для передачи списка команде tr. Передаваемые файлы получают расширение UC. Обратите внимание, что при использовании в цикле for команды ls применяются обратные кавычки.
$ pg forUC
#!/bin/sh
# forUC
for files in Us LPSO*'
do
cat $files | tr "[a‑z]" "[A‑Z]" > $files.UC
done
18.5.8. Удаления, выполняемые с помощью редактора sed
В следующем примере для удаления всех пустых строк применяется потоковый редактор sed. Выходной поток данных направляется в новые файлы с расширением .HOLD. Затем команда mv возвращает файлам их исходные имена.
$ pg forsed
#!/bin/sh
# forsed
for files in `ls LPSO*` do
sed -e "/^$/d" $files > $files. HOLD
mv $flies. HOLD $files
done
18.5.9. Подсчет с помощью циклов
При обсуждении команды expr отмечалось, что эта команда применяется, если в циклы необходимо ввести счетчики. Ниже рассматривается пример, в котором цикл for обрабатывает файлы, а вывод и подсчет количества файлов осуществляется с помощью команды ls.
$ 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