Шрифт:
$ grepif
No Dave is not in the file
В примере вывод команды grep направляется в системную корзину. Если поиск значения, совпадающего с шаблоном, завершился удачно, команда grep возвращает
значение 0. В этом случае происходит (естественная интеграция с оператором if; если команда grep успешно завершилась, часть if принимает значение "истина".
18.3.4. Проверка вывода команды grep с помощью переменной
Как уже упоминалось, команду grep можно применять в строке. В следующем сценарии пользователь вводит список имен; затем команда grep ищет переменную, которой присвоено имя некого лица (Peter).
$ pg grepstr
#!/bin/sh
# grepstr
echo -n "Enter a list of names:"
read list
if echo $1ist | grep "Peter" > /dev/null 2>&1
then
echo "Peter ls here"
# можно ли выполнить обработку здесь
else
echo "Peter's not in the list. No comment!"
fi
Ниже приводятся результаты вывода, где содержится несколько имен.
$ grepstr
Enter a list of names:John Louise Peter James
Peter is here
18.3.5. Проверка результата копирования файла
А теперь осуществим проверку того, успешно ли прошло копирование файла. Если команда cp не скопировала файл myfile в файл myfile.bak, отображается сообщение об ошибке. Обратите внимание, что в сообщении об ошибке фигурирует команда `basename $0` которая выводит на экран название сценария.
Если все сценарии завершаются ошибкой, желательно, чтобы наряду с указанием на стандартную ошибку отображалось и название сценария. В конце концов, пользователю важно знать название сценария, выполнение которого привело к появлению ошибки.
$ pg ifcp
#!/bin/sh
# ifcp
if cp myfile myfile.bak; then
echo "good copy"
else
echo "`basename $0`: error could not copy the files" >&2 fi
$ ifcp
cp: myfile: No such file or directory
ifcp: error could not copy the files
Обратите внимание на то, что в данном случае файл не может быть найден, и генерируется системное сообщение об ошибке. Ошибки такого типа могут негативно
отразиться на выводимых данных; сценарий уже отображает сообщения об ошибках, поэтому известно, что он функционирует неверно. Зачем же нам повторное уведомление? Чтобы избавиться от ошибок, генерируемых системой, и системных данных вывода, достаточно применить перенаправление стандартного потока ошибок и потока вывода. Для этого немного перепишем сценарий: > /dev/null 2>&1. В этом случае получим следующее:
$ pg ifcp
#!/bin/sh
# ifcp
if cp myfile myfile.bak >/dev/null 2>&1; then
echo "good copy"
else
echo "`basename $0`: error could not copy the files" >&2
fi
При выполнении сценария все выводимые данные, включая ошибки, направляются в системную корзину.
$ ifcp
ifcp: error could not copy the files
18.3.6. Проверка текущего каталога
Некоторые сценарии, реализующие административные задачи, можно выполнять из корневого каталога. Если производится глобальное перемещение файлов или же изменяются права доступа к файлу, несложный тест позволяет уточнить, вовлекается ли в этот процесс корневой каталог. В следующем сценарии для хранения текущего каталога переменная DIRECTORY использует подстановку команд. Затем значение этой переменой сравнивается со строкой, содержащей значение "/" (которое и соответствует корневому каталогу). Если значение переменной directory не идентично этой строке, пользователь завершает работу со сценарием. В этом случае код завершения будет 1, что свидетельствует о наличии ошибки.
$ pg ifpwd
#!/bin/sh
# ifpwd DIRECTORY=`pwd`
# захват текущего каталога
if [ "$DIRECTORY" != "/" ]; then
#это корневой каталог ?
#нет, перенаправление вывода в стандартный поток ошибок, который
#отображается на экране по умолчанию.
echo "You need to be in the root directory not $DIRECTORY to run this script" >&2
# выход из сценария со значением 1, ошибка
exit 1
fi
18.3.7. Проверка прав доступа к файлу