Литмир - Электронная Библиотека

case $WHEN in Monday|MONDAY|mon);;

Sunday|SUNDAY|sun);;

Saturday|SATURDAY}sat);;

*) echo " Are you nuts!, this report can only be run on " >&2

echo " on a Saturday, Sunday or Monday" >&2

exit 1

esac

echo "Report to run on $WHEN"

# здесь команда для выполнения действительного отчета

При корректных начальных данных получим:

$ caserep

Weekly Report What day do you want to run report [Saturday] : validating..Saturday Report to run on Saturday

Если начальные данные были неправильны, получим:

$ caserep

Weekly Report What day do you want to run report [Saturday] :Tuesday validating..Tuesday

Are you nuts! this report can only be run on a Saturday, Sunday or Monday

Можно заключить, что оператор case функционирует так же, как и несколько операторов if then else. Такой вывод вполне правомерен.

18.5. Цикл for

Общий формат цикла:

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

do

команда1 команда…

done

Цикл for однократно обрабатывает всю информацию для каждого значения, включенного в список list. Чтобы получить доступ к каждому значению в списке, достаточно задать параметр имя_переменной. Командой служит любая действительная команда или оператор интерпретатора shell. В качестве параметра имя_переменной можно указать любое слово.

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

Опция in list может содержать подстановки, строки и имена файлов. Рассмотрим несколько примеров.

18.5.1. Простой цикл for

Этот цикл просто выводит на экран список, который состоит из " 1 2 3 4 5". Чтобы получить доступ к каждой переменной, в качестве параметра имя_переменной указывается "loop".

$ pg for_i

#!/bin/sh

# for_i

for loop in 1 2 3 4 5

do

echo $LOOP done

Приведенный выше сценарий выводит следующие данные:

$ for_i

1

2

3

4

5

18.5.2. Вывод на экран строки списка

Ниже приводится цикл for, список которого содержит строку значений "orange red blue grey". Для каждой переменной указана команда echo, в качестве параметра имя_переменной указывается loop. Команда echo с помощью части $LOOP выводит на экран каждое значение списка до тех пор, пока список не окажется пустым.

$ pg forlist

#!/bin/sh

# forlist

for LOOP in orange red blue grey

do

echo $LOOP

done

$ forlist

orange

red

blue

grey

Также с помощью цикла имя_переменной можно комбинировать строки (в данном случае речь идет о цикле loop).

echo "this ls the fruit $LOOP"

Результат:

This ls the fruit orange red blue grey

18.5.3. Использование команды ls совместно с циклом for

Этот цикл оценивает команду ls интерпретатора shell и отображает сведения о файлах текущего каталога.

$ pg forls

#!/bin/sh

# forls

for loop in `ls`

do

echo $LOOP

done

$ forls

array

arrows

center

center1

center2

centerb

18.5.4. Применение параметров вместе с циклом for

Если в цикле for опустить часть in list, позиционные параметры командной строки становятся аргументами. Действительно, этот подход аналогичен следующему:

for params in "$@"

или

for params in "$*"

Ниже приводится пример, который показывает, как можно избежать применения конструкции in list. Цикл for обращается к специальному параметру $@ или $* для получения аргументов из командной строки.

$ pg forparam2

#/bin/sh

# forparam2

for params in $*

do

echo "You supplied $params as a command line option"

done

echo $params done

$ forparam2 myfile1 myfile2 myfile3

You supplied myfile1 as a command line option

You supplied myfile2 as a command line option

You supplied myfile3 as a command line option

Следующий сценарий содержит часть in "$@" и образует тот же самый поток вывода, что и предыдущий сценарий.

$ pg forparam3

#!/bin/sh

# forparam3

for params in $@

do

echo "You supplied $params as a command line option"

done

echo $params done

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

$ pg forfind

#!/bin/sh

# forfind

for LOOP in $@

do

find / -name $LOOP -print

done

Значения передаются с помощью параметра командной строки и образуют часть -name команды find .

$ forfind passwd LPSO.AKSOP

/etc/passwd

/etс/pam.d/passwd

/etc/uucp/passwd

/usr/bin/passwd

/usr/local/accounts/LPSO.AKSOP

18.5.5. Посылка сигналов серверам с помощью цикла for

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

$ pg forping

#!/bin/sh

# forping

HOSTS=”1itserv dnssevr acctsmain ladpd ladware"

for loop in $HOSTS

do

ping -c 2 $LOOP

done

18.5.6. Создание резервных копий файлов с помощью цикла for

Цикл for можно использовать для создания резервных копий файлов. При этом переменная просто добавляется к целевому аргументу команды ср. Ниже применяется переменная под названием ВАК. Эта переменная добавляется к каждому имени целевого файла при использовании цикла с помощью команды ср. Список включает shell–команду ls.

$ pg forcp

#!/bin/sh

# forcp

BAK=".bak"

for loop in `ls`

do

echo "copying $LOOP to $LOOP$BAK"

cp $LOOP $LOOP$BAK done

$ forcp

copying array to array.bak

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.

63
{"b":"273485","o":1}