и "Monday". Обратите внимание, что всевозможные аббревиатуры названий дней недели составлены так, чтобы выполнялся перехват "всех возможных" комбинаций этих названий.
Ниже приводится соответствующий сценарий.
$ pg caserep
#!/bin/sh
# caserep
echo " Weekly Report"
echo -n "What day do you want to run report [Saturday] :"
#если нажать клавишу ввода, принимается заданное по умолчанию название Saturday
read WHEN
echo "validating..
${WHEN:="Saturday"}"
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 может содержать подстановки, строки и имена файлов. Рассмотрим несколько примеров.
Этот цикл просто выводит на экран список, который состоит из " 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
Ниже приводится цикл 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
Этот цикл оценивает команду ls интерпретатора shell и отображает сведения о файлах текущего каталога.
$ pg forls
#!/bin/sh
# forls
for loop in `ls`
do
echo $LOOP
done
$ forls
array
arrows
center
center1
center2
centerb
Если в цикле for опустить часть in list, позиционные параметры командной строки становятся аргументами. Действительно, этот подход аналогичен следующему:
for params in "$@"
или
for params in "$*"
Ниже приводится пример, который показывает, как можно избежать применения конструкции in list. Цикл for обращается к специальному параметру $@ или $* для получения аргументов из командной строки.
$ pg forparam2
#/bin/sh
# forparam2
for params in $*
do