Рассмотрим, как работает приведенный сценарий. Сначала проверим, установлена ли эта переменная. Если это так, появляется сообщение, что редактор vi применяется как редактор, заданный по умолчанию. Затем vi устанавливается в качестве редактора, и сценарий завершается.
Если редактор vi не установлен, пользователю поступает запрос, следует ли установить это значение. Проверка выполняется независимо от регистра, в котором находится символ у. Если пользователь не вводит значения, отличные от у или у, сценарий завершается.
На данном этапе пользователю предлагается ввести тип редактора. Затем выполняется проверка, не установлен ли данный редактор, а также уточняется, не нажимал ли пользователь во время проверки $editor ="" клавишу [Return]. Действительно эта проверка реализована лучше, чем -z $editor, но оба этих метода приводятся лишь в качестве иллюстрации. Если результаты проверки будут отрицательны, на экран выводится сообщение, что применяется редактор vi, причем значение vi присваивается переменной editor.
Если пользователь вводит имя для переменной editor, происходит присвоение и экспорт этого имени.
18.3.19. Проверка кода завершения последней команды
До сих пор каталог создавался путем передачи названия каталога в сценарий. Затем сценарий запрашивал пользователя, создан ли каталог. В следующем примере создается каталог, и все файлы *.txt копируются из текущего каталога в новый каталог. В приведенном сценарии с помощью кода завершения последней команды проверяется успешность выполнения каждой из команд. Если результаты выполнения команд неудовлетворительны, пользователю направляется соответствующее сообщение.
$ pg ifmkd±r2
#!/bin/sh
#ifmkdir2
DIR_NAME=testdirec
#где мы находимся?
THERE=`pwd`
# перенаправление потока вывода в системную корзину
mkdir $DIR_NAME > /dev/null 2>&1
# каталог ли это ?
if [ -d $DIR_NAME ] ; then
# можно ли применить к каталогу команду cd
cd $DIR_NAME
if [ S? = 0 ]; then
# да, можно
HERE=`pwd`
cp $THERE/*.txt $HERE
else
echo "Cannot cd to $DIR_NAME" >&2
exit 1
fi
else
echo "cannot create directory $DIR_NAME" >&2
exit 1
fi
18.3.20. Добавление и проверка целых значений
В следующем примере рассматривается проверка чисел. Сценарий содержит набор значений счетчика, который легко изменяется при вводе пользователем нового числа. Затем сценарий добавляет это новое значение к постоянному значению, равному 100. Ниже показано, как выполняется подобный сценарий.
Пользователь может изменить значение путем ввода нового значения, или же ничего не менять, нажав клавишу [Return]. Затем текущее значение выводится на экран, и сценарий завершается.
Если пользователь вводит у или у, поступает приглашение на ввод нового значения, которое добавляется к счетчику. Если пользователь нажимает клавишу [Return], сценарий с помощью команды echo сообщает, что счетчик сохраняет старое значение. Когда пользователь вводит значение, проверка чисел позволяет уточнить, является ли это значение числом. Если это так, значение добавляется к значению counter и затем отображается на экране.
$ pg ifcounter
#!/bin/sh
# ifcounter
COUNTER=100
echo "Do you wish to change the counter value currently set at $COUNTER ? [y...n] :"
read ANS
if [ "$ANS"="y" ] || [ "$ANS"="Y" ]; then
# да, пользователь желает изменить значение
echo "Enter a sensible value "
read VALUE
#простой тест для уточнения, является ли значение численным,
#добавим к VALUE любое число, проверим код возврата
expr $VALUE + 10 > /dev/null 2>&1
STATUS=$?
# проверим код возврата для expr
if [ "$VALUE"="" ] || [ "$STATUS" != "0" ]; then
# направим ошибки в стандартный поток ошибок
echo " You either entered nothing or a non‑numeric " >&2
echo " Sorry now exiting..counter stays at. $COUNTER" >&2 exit 1 fi
# если мы здесь, значит, это — число, добавим его к COUNTER
COUNTER=`expr $COUNTER + $VALUE`
echo " Counter now set to $COUNTER" else
#если мы здесь, значит, пользователь вместо того, чтобы ввести число,
#нажал клавишу ввода
#или ответим n для изменения значения приглашения
echo " Counter stays at $COUNTER"
fi
Рассмотрим результаты выполнения приведенного сценария.
$ ifcount
Do you wish to change the counter value currently set at 100? [y..n]:n Counter stays at 100
$ ifcount
Do you wish to change the counter value currently set at 100? [y..n]:y
Enter a sensible value: fdg
You either entered nothing or a non‑numeric
Sorry now exiting..counter stays at 100
$ ifcount
Do you wish to change the counter value currently set at 100? [y..n]:y Enter a sensible value: 250
Counter now set to 350
18.3.21. Простой сценарий, обеспечивающий безопасность при регистрации
А теперь рассмотрим структурное дополнение, которое усиливает меры безопасности при регистрации пользователя перед запуском приложений. Поступает приглашение на ввод имени пользователя и пароля; если имя пользователя и пароль
совпадают со строками, включенными в сценарий, пользователь регистрируется. Если
такого совпадения не наблюдается, пользователь завершает работу.
Сценарий устроен так, что вначале переменные получают значение "ложь". Предполагается, что вводные данные пользователя окажутся ошибочными. Текущие установки команды stty сохраняются, поэтому можно скрыть символы, которые вводятся в поле пароля. Затем установки stty восстанавливаются.
Если вводится корректный ID пользователя и пароль (паролем является mayday), переменные invalid_user и invalid_passwd для недействительного пользователя или пароля имеют значение "по". Затем производится тестирование, и если какая‑либо из переменных принимает значение yes, сценарий для этого пользователя завершается по умолчанию.
К работе допускаются пользователи с действительными ID и паролями. В регистрационном сценарии удобно применять описанное структурное дополнение. В данном примере действительными ID пользователя служат dave или pauline.
$ pg ifpass
#!/bin/sh
#ifpass
#установим значения переменных в "ложь" INVALID_USER=yes
INVALID_PASSWD=yes
# сохранение текущих установок команды stty
SAVEDSTTY=`stty -g`
echo "You are logging into a sensitive area"
echo -n "Enter your ID name :"
read NAME
# скройте символы, введенные в терминале
stty -echo
echo "Enter your password :"
read PASSWORD
# попробуем снова
stty $SAVEDSTTY
if [ "$NAME"="dave" ] || [ "$NAME"="pauline" ]; then
# если действительно, установите переменную
INVALID_USER=no
fi
if [ "$PASSWORD"="mayday" ]; then
# если пароль действителен, установите переменную
INVALID_PASSWD=no
fi
if [ "$INVALIDUSER"="yes" -o "$INVALID_PASSWD"="yes" ]; then
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