Enter your ID name : dave
Enter your password :
ifpass :Sorry wrong password or userid
Введем верное имя регистрационное имя и пароль.
$ ifpass
You are logging into a sensitive area
Enter your ID name : dave
Enter your password :
correct user id and password given
18.3.22. Применение elif
Часть elif оператора if then else применяется для проверки при наличии более чем двух условий,
18.3.23. Несколько проверок, реализуемых с помощью elif
В следующем несложном примере протестируем введенные в сценарий имена пользователей.
Сначала в сценарии проверяется, действительно ли пользователь ввел имя; если имя не введено, то проверка не выполняется. Если имя введено, с помощью части elif проверяется, совпадает ли имя с root, louise или dave. В случае несовпадения имени ни с одним из перечисленных имен на экран выводится сообщение, что пользователь не является пользователем root, louise или dave.
$ pg ifelif
#!/bin/sh
# ifelif
echo -n "enter your login name :"
read NAME
# имя не введено, рассмотрение прекращается
if [ -z $NAME ] || [ "$NAME"="" ]; then
echo "You did not enter a name"
elif
# является ли именем root
[ "$NAME"="root" ]; then echo "Hello root"
elif
# именем является louise
[ $NAME="louise" ]; then echo "Hello louise"
elif
# именем является dave
[ "$NAME"="dave" ]; then echo "Hello dave"
else
# нет, это какое‑то другое имя
echo "You are not root or louise or dave but hi $NAME"
fi
При выполнении приведенного сценария с использованием различных регистрационных имен получим следующее:
$ ifelif
enter your login name : dave Hello dave
$ ifelif
enter your login name : You did not enter a name
$ ifelif2
enter your login name : peter
You are not root or louise or dave but hi peter
18.3.24. Проверка нескольких вариантов размещения файла
Предположим, что к файлу проверки регистрации требуется применить команду cat. Файл в зависимости от того, кто из пользователей выполнял инсталляцию. находится либо в каталоге /usr/opts/audit/logs, либо в каталоге /usr/Iocal/audit/logs. Перед применением к файлу команды cat следует убедиться в том, что его можно просматривать; именно это и будет уточняться при проверке. Если файл нельзя найти или же его нельзя просматривать, на экран выводится сообщение об ошибке. Ниже приводится соответствующий сценарий:
$ pg ifcataudit
#!/bin/sh
#ifcataudit
#размещение файла регистрации
LOCAT_1=/usr/opts/audit/logs/audit.log
LOCAT_2=/usr/local/audit/audit, logs
if [ -r $LOCAT_1]; then
#если файл находится в этом каталоге и может просматриваться,
#применим к нему команду cat echo "Using L0CAT_1"
cat $LOCAT_1
elif
# иначе, файл должен находиться в этом каталоге и можно его просматривать
[ -r §L0CAT_2 ]
then
echo "Using LOCAT_2"
cat $LOCAT_2
else
# нет ни в одном каталоге…
echo `basename $0`: Sorry the audit file ls not readable or cannot be located." >S2
exit 1
fi
Если при выполнении указанного сценария установлено, что файл находится в каком‑либо из двух каталогов и может просматриваться, то к нему можно применить команду cat. В противном случае на экран выводится сообщение об ошибке, и сценарий завершается. Этот пример неудачен, поскольку наш воображаемый файл отсутствует.
$ ifcataudit
ifcataudit: Sorry the audit file ls not readable or cannot be located.
18.4. Оператор case
Оператор case является многовариантным оператором. С его помощью можно искать значения, используя заданный шаблон. Если совпадение с шаблоном установлено, можно выполнять команды, основываясь исключительно на этом соответствии. Ниже приводится формат оператора case:
case значение in шаблон1)
команды1
;;
шаблон2)
команды2
;;
esac
Рассмотрим, как функционирует оператор case. После значения должен находиться предлог "in", а каждый шаблон должен завершаться правой скобкой. В качестве значения может применяться переменная или константа. Когда устанавливается соответствие с шаблоном, для этого шаблона выполняются все команды вплоть до символов ;;.
Поиск значения, совпадающего с шаблоном, выполняется по каждому шаблону. Если устанавливается соответствие с шаблоном, то оставшиеся шаблоны уже не проверяются. Эти шаблоны не принимаются во внимание даже после выполнения команд, относящихся к шаблону, с которым установлено соответствие. Если поиск соответствия по всем шаблонам оказался безрезультатным, можно принять значение с помощью символа звездочки. Этот символ используется для фиксации любых вводимых данных.
Шаблонная часть может содержать метасимволы. Аналогичным образом соответ–ствие с шаблоном устанавливается при обработке расширений имен файлов в командной строке:
* Произвольные символы
? Произвольный отдельный символ
[. . ] Произвольный символ из класса или диапазона
А теперь рассмотрим несколько примеров.
18.4.1. Простой оператор case
Следующий сценарий отображает приглашение для ввода чисел от 1 до 5. Число передается оператору case, переменной ans присваивается значение ans оператора case, и значение ANS сравнивается с каждым шаблоном.
Если соответствие установлено, команды из шаблонной части выполняются до тех пор, пока не появятся символы ;;. Тогда на экран выводится команда, которая информирует пользователя о сделанном выборе. Затем выполнение оператора case завершается, поскольку совпадение с шаблоном установлено.
Далее выполняются операции, находящиеся после оператора case.
Если соответствие не найдено, с помощью шаблона * выполняется прием всей информации. Затем отображается сообщение об ошибке.
$ pg caseselect
#!/bin/sh
# caseselect
echo -n "enter a number from 1 to 5 :"
read ANS
case $ANS in
1) echo "you select 1"
;;
2) echo "you select 2"
;;
3) echo "you select 3"
;;
4) echo "you select 4"
;;
5) echo "you select 5"
;;
*) echo "`basename $0`: This is not between 1 and 5" >&2
;;
exit 1
esac
Если этот сценарий выполняется с различными вводимыми данными, получим:
$ caseselect
enter a number from 1 to 5 : 4 you select 4
С помощью шаблона * выполним прием информации, с которой не установлено соответствия:
$ caseselect
enter a number from 1 to 5 :pen
caseselect: This ls not between 1 and 5
18.4.2. Применение символа | при поиске по шаблону
При использовании оператора case в качестве команды or можно указывать символ. Например, vt100|vt102) соответствует шаблону vt100 или vt102.
В следующем примере у пользователя запрашивают тип терминала. Если пользователь вводит vt100 или vt102, выполняется сравнение с шаблоном "vtl00| vtl02)". В данном случае переменной term присваивается значение vt100. Если пользователь
указывает тип терминала, который не соответствует шаблону, с помощью шаблона * выполняется прием этой информации и значение типа терминала все равно устанавливается как vt100. Наконец, за пределами действия оператора case производится экспорт переменной term. Независимо от тех сведений, которые вводит пользователь, переменная term представляет действительный тип терминала, поскольку используется поиск по шаблону*.