Чтение онлайн

ЖАНРЫ

Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:

Чтобы выяснить, была ли выполнена команда grep, можно применить оператор if. В приведенном ниже примере команда grep используется для уточнения, содержится ли в файле data.file слово "Dave". Обратите внимание на то, что при поиске соответствия используется шаблон "Dave\>".

$ pg grepif

#!/bin/sh

# grepif

if grep 'Dave\>' data.file > /dev/null 2>&l

then

echo "Great Dave ls in the file" else

echo "No Dave ls not in the file"

fi

$ 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. Проверка прав доступа к файлу

Вы можете также осуществлять контроль прав доступа к файлу. Ниже приводится несложная проверка на предмет того, можно ли вести записи в файле test.txt, который переприсвоен переменной logfile.

$ pg ifwr

#!/bin/sh

# ifwr

LOGFILE=test.txt echo $LOGFILE

if [ ! —w "$LOGFILE" ]; then

echo " You cannot write to $LOGFILE " >&2

fi

18.3.8. Проверка параметров, передаваемых сценарию

Оператор if может применяться при определении числа параметров, которые передаются сценарию. Чтобы проверить, соответствует ли количество необходимых параметров количеству вызываемых параметров, используется специальная переменная $#, содержащая число вызываемых параметров.

В приведенном ниже примере проверяется наличие трех параметров; если они отсутствуют, на экран выводится сообщение из стандартного потока ошибок. Затем сценарий завершается, отображая статус ошибки. Если же количество параметров равно трем, все аргументы выводятся на экран.

Поделиться с друзьями: