Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
echo " `basename $0 :` Sorry wrong password or userid"
exit 1
fi
# если вы здесь, ваш ID и пароль в порядке.
echo "correct user id and password given"
Если при выполнении приведенного сценария указывается недействительный пароль, получим:
$ ifpass
You are logging into a sensitive area
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 оператора 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 сравнивается с каждым шаблоном.