, стандартная подсказка или приглашение командной оболочки, на символ
>
, когда оболочка ожидает очередной ввод. Вы можете продолжить набор, дав оболочке понять, когда закончите, и сценарий немедленно выполнится.
В этом примере команда
grep
выводит на экран найденные ею имена файлов, содержащих строку
POSIX
, а затем команда
more
отображает на экране содержимое файла. В конце на экран возвращается приглашение командной оболочки. Обратите внимание также на то, что вы ввели переменную командной оболочки, которая обрабатывает каждый файл для самодокументирования сценария. С таким же успехом вы могли бы использовать переменную
i
, но имя
file
более информативно с точки зрения пользователей.
Командная оболочка также обрабатывает групповые символы или метасимволы (часто называемые знаками подстановки). Вы почти наверняка знаете о применении символа
*
как знака подстановки, соответствующего строке символов. Но вы можете не знать о существовании односимвольного знака подстановки,
?
, а конструкция
[set]
позволяет проверить любое количество одиночных символов,
[^set]
— применяет логическую операцию "НЕ" к множеству, т.е. включает все, кроме того, что вы задали. Подстановочный шаблон из фигурных скобок
{}
(доступен в некоторых командных оболочках, включая bash) позволяет формировать множество из произвольных строк, которое командная оболочка раскроет. Например, команда
$ ls my_{finger, toe}s
будет выводить файлы my_fingers и my_toes. Эта команда использует оболочку для проверки всех файлов в текущем каталоге. Мы вернемся к этим правилам соответствия шаблонам в конце главы, когда будем более подробно рассматривать утилиту
grep
и возможности регулярных выражений.
Опытные пользователи ОС Linux, вероятно, выполнят эту операцию более эффективным способом, возможно, с помощью следующей команды:
$ more `grep -l POSIX *`
или синонимической конструкции
$ more $(grep -l POSIX *)
В дополнение команда
$ grep -l POSIX * | more
выведет на экран имя файла, содержащего строку
POSIX
. В этом сценарии мы видим, что командная оболочка для выполнения трудной работы привлекает другие команды, например,
grep
и
more
. Оболочка просто позволяет собрать вместе несколько имеющихся команд новыми оригинальными способами. В следующих сценариях вы увидите использование знаков подстановки неоднократно. Мы подробно рассмотрим целую область подстановок, когда будем знакомиться с регулярными выражениями в разделе, посвященном команде
grep
.
Заниматься этой канителью каждый раз, когда хочешь выполнить последовательность команд, утомительно. Нужно сохранить команды в файле, который принято называть сценарием или скриптом командной оболочки, а затем вы можете выполнять эти файлы, когда захотите.
Создание сценария
С помощью любого текстового редактора необходимо создать файл, содержащий команды. Создайте файл с именем first с таким содержимым:
#!/bin/sh
# first
# Этот файл просматривает все файлы в текущем каталоге
# для поиска строки POSIX, а затем выводит имена
# найденных файлов в стандартный вывод.
for file in *
do
if grep -q POSIX $file
then
echo $file
fi
done
exit 0
Комментарий начинается со знака
#
и продолжается до конца строки. Принято знак
#
ставить в первой символьной позиции строки. Сделав такое общее заявление, далее отметим, что первая строка
#!/bin/sh
— это особая форма комментария; символы
#!
сообщают системе о том, что следующий за ними аргумент — программа, применяемая для выполнения данного файла. В данном случае программа
/bin/sh
— командная оболочка, применяемая по умолчанию.
Примечание
Обратите внимание на абсолютный путь, заданный в комментарии. Принято сохранять его длиной не более 32 символов для обратной совместимости, поскольку некоторые старые версии ОС UNIX могут использовать только такое ограниченное количество символов в комментарии
#!
, хотя у ОС Linux обычно нет подобного ограничения.
Поскольку сценарий по существу обрабатывается как стандартный ввод командной оболочки, он может содержать любые команды ОС Linux, на которые ссылается переменная окружения
PATH
.
Команда
exit
гарантирует, что сценарий вернет осмысленный код завершения (подробнее об этом чуть позже в данной главе). Он редко проверяется при интерактивном выполнении программ, но если вы хотите запускать данный сценарий из другого сценария и проверять, успешно ли он завершился, возврат соответствующего кода завершения очень важен. Даже если вы не намерены разрешать вашему сценарию запускаться из другого сценария, все равно следует завершать его с подходящим кодом. Верьте в полезность своего сценария: вдруг когда-нибудь он потребуется для многократного использования как часть другого сценария.