Операционная система UNIX - Страница 24
Более сложные выражения могут быть образованы с помощью логических операторов:
!выражение | Истинно, если выражение ложно (оператор NOT) |
выражение1 -а выражение2 | Истинно, если оба выражения истинны (оператор AND) |
выражение1 -o выражение2 | Истинно, если хотя бы одно из выражений истинно (оператор OR) |
Приведем несколько примеров использования выражений.
Фрагмент скрипта, используемый при регистрации нового пользователя. Скрипт проверяет наличие в домашнем каталоге инициализационного скрипта .profile и в случае его отсутствия копирует шаблон:
if [ ! -f $НОМЕ/.profile ]then echo "файла .profile не существует - скопируем шаблон" cp /usr/lib/mkuser/sh/profile $НОМЕ/.profilefiФрагмент скрипта, проверяющего наличие новой почты в почтовом ящике пользователя
if [ -s $MAIL ]then echo "Пришла почта"fiФрагмент скрипта инициализации системы — запуска "суперсервера" Internet inetd(1M). Если исполняемый файл /etc/inetd существует, он запускается на выполнение.
if [ -х /etc/inetd ]then /etc/inetd echo "запущен сервер inetd"fiФрагмент скрипта, анализирующий ввод пользователя, сохраненный в переменной ANSW. Если пользователь ввел 'N' или 'n', скрипт завершает свою работу.
if [ "$ANSW" = "N" -о "$ANSW" = "n" ]then exitfiЦиклы
Язык программирования Bourne shell имеет несколько операторов цикла. Приведем их синтаксис:
1)
while условиеdo command1 command2 ...done2)
until условиеdo command1 command2 ...done3)
for var in списокdo command1 command2 ...doneС помощью оператора while команды
command1command2условиеусловиеtestВ случае оператора until команды
command1command2условиеОператор for обеспечивает выполнение цикла столько раз, сколько слов в
спискеvarВ другой форме for, когда список отсутствует, переменная var принимает значения позиционных параметров, переданных скрипту.
Чтобы наглядно представить себе приведенные операторы, обратимся к конкретным примерам.
Например, скрипт монтирования всех файловых систем /etc/mounall для системы Solaris 2.5 включает в себя их проверку, исходя из данных, указанных в файле /etc/vfsck. При этом используется оператор while.
#cat /etc/vfsck |while read special fsckdev mountp fstype fsckpass automnt mntopts# Построчно считывает записи файла vfsck и присваивает переменным spe-# cial, fsckdev и т.д. значения соответствующих конфигурационных полей.do case $special in '# ' * | '' ) # Игнорируем комментарии continue ;; '-') # Игнорируем строки, не требующие действия continue ;; esac # Последовательно проверяем файловые системы с помощью утилиты # /usv/sbin/fsck /usr/sbin/fsck -m -F $fstype $fsckdev >/dev/null 2>&1 ...doneСкрипт очистки давно не используемых файлов во временных каталогах (обычно он запускается при загрузке системы) использует оператор for.
for dir in /tmp /usr/tmp /home/tmpdo find $dir ! -type d -atime +7 -exec rm {} ;doneПри этом удаляются все файлы в указанных каталогах (/tmp, /usr/tmp и /home/tmp), последний доступ к которым осуществлялся более недели назад.
Селекторы
Оператор case предоставляет удобную форму селектора:
case слово inшаблон1)