Если в отдел учета следует направить отчет об учетной записи, сначала желательно удостовериться, что пользователь правильно ввел номер отдела, а затем уже уточнить, какой отчет выполняется. Такой подход реализуется при сравнении с шаблоном всех требуемых значений; любые другие методы неприемлемы.
В следующем сценарии указано, что если пользователь вводит номер отдела, который не совпадает со значением 234, 453, 655 или 454, то пользователь выйдет из сценария. Если номер отдела указан правильно, аналогичный подход применяется при определении типа отчета. По окончании выполнения оператора case остаются действительный номер отдела и правильный тип отчета. Ниже приводится соответствующий сценарий.
$ pg casevalid
#!/bin/sh
# casevalid
TYPE=""
echo -n "enter the account dept No: :"
read ACC
case $ACC in
234);;
453);;
655);;
454) ;;
*) echo "`basename $0`: Unknown dept No:" >&2
echo "try..234,453,655,454" exit, 1
esac
# если оказались здесь, получен верный номер отдела
echo " 1. post"
echo " 2. prior"
echo -n "enter the type of report: "
read ACC_TYPE
case $ACC_TYPE in
l)TYPE=post;;
2}TYPE=prior;;
*) echo "`basename $0`: Unknown account type." >&2
exit 1
;;
esac
# если оказались здесь, значит все указано правильно!
echo "now running report for dept $ACC for the type $TYPE"
# выполняем отчет о команде.
Если вводимые данные достоверны, получим:
$ casevalid
enter the account dept No: :234
1. . post
2. . prior
enter the type of report:2
now running report for dept 234 for the type prior
Если номер отдела введен неверно, получим:
$ casevalid
enter the account dept No: :432
casevalid: Unknown dept No: try..234,453,655,454
При вводе неправильного типа отчета, получим:
$ casevalid
enter the account dept No: :655
1. . post
2. . prior
enter the type of report:4
casevalid: Unknown account type.
18.4.6. Значения переменных, заданные по умолчанию
Если при просмотре значения переменной пользователь нажимает клавишу [Return], сценарий завершает работу не всегда. С помощью проверки определяется, установлена ли данная переменная, и если не установлена, то ей может быть присвоено значение.
В следующем сценарии для выполнения отчета пользователю предлагают ввести название дня недели. Если пользователь нажимает клавишу [Return], используется день недели, заданный по умолчанию, а именно "Saturday". Это название и присваивается переменной when.
Если пользователь вводит название другого дня, с помощью оператора case выполняется проверка, совпадает ли введенное название с названием одного из дней недели, предназначенных для выполнения сценария, а именно "Saturday", "Sunday"
и "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. В качестве параметра имя_переменной можно указать любое слово.