бы мы строили для себя некоторую подстраховку.
Бывает, что на создание команды, которая делает именно то, что нужно, уходит несколько часов. Например, есть программа, создающая ISO-образы диска для последующей записи на CD-ROM. На странице ее описания перечислены сотни параметров, но команда, позволяющая создать образ, читаемый в Windows, UNIX и Mac OS X, достаточно проста:
$ mkisofs — D -l — J -r — L -f — P
Конечно, все можно проделать с помощью графического интерфейса, но вы не получите никакого удовольствия (а также возможности создать сценарий).
Эта команда позволяет вам делать то, что недоступно в большинстве графических интерфейсов, например сообщать об авторских правах, указывать имя автора и т. д.
Она хорошо встраивается в JJAT-файл (в DOS) или в сценарий оболочки UNIX/Linux.
Вот пример сценария makeimage1, в котором используется эта команда:
#!/bin/bash
mkisofs — D -l — J -r — L -f — P 'Limoncelli' — V 'date — u +%m%d' $*
Конструкция 'date — u +%m%d' создает метку тома, содержащую текущую дату.
Я долго не мог создавать хорошие сценарии, потому что не знал, как обрабатывать параметры командной строки. Расскажу, как следует копировать их в сценарий.
Конструкция $* в сценарии означает «любые элементы командной строки». Если вы введете:
$ makeimage1 cdrom/
то последовательность $* будет заменена на cdrom/.
Поскольку $* работает и с несколькими аргументами, вы можете ввести:
$ makeimage1 cdrom/
В этом случае вместо $* будут подставлены все три аргумента. Команда
Еще одной причиной, не позволявшей мне писать хорошие сценарии, было мое неумение обрабатывать флаги командной строки, например scriptname — q file1.txt. Если сценарий, который требовалось написать, был настолько сложен, что требовал учета флагов командной строки, я использовал другой язык или вообще отказывался от создания сценария. Оказывается, в
args='getopt ab: $*'
if [$?!= 0]
then
echo 'Usage; command [-a] [-b file.txt] file1 file2…'
exit -1
fi
set — $args
for i
do
case '$i'
in
-a)
FLAGA=1
shift
;;
-b)
ITEMB='$2'; shift
shift
;;
-)
shift; break
;;
esac
done
Предполагается, что есть некая команда с флагами — а и — b. Второй флаг особый, потому что за ним должен следовать аргумент, например — b file.txt. Из первой строчки понятно, что за командой getopt следуют буквы, которые могут быть флагами. После флага, которому требуется дополнительный аргумент, стоит двоеточие. Далее мы видим оператор case (выбор) для каждого возможного аргумента. Код оператора либо устанавливает флаг, либо устанавливает флаг и сохраняет аргумент.
А что такое $2? И какой смысл в — )? И что делает set? И как поживает Наоми? Все это вы сможете узнать потом. А сейчас воспользуйтесь образцом, и он будет работать.
(Ну ладно. Если вы вправду хотите в этом разобраться, прочитайте «Advanced Bash-Scripting Guide» (Расширенное руководство по написанию скриптов bash) по адресу http://www.tldp.org/LDP/abs/html.)
Теперь я приведу более развернутый пример, иллюстрирующий некоторые дополнительные возможности. Во-первых, в нем определяется функция usage, предназначенная для вывода справочной информации. Интересная особенность этой функции — команда echo, растянутая на несколько строк. Неплохо, не так ли? bash не возражает. Во-вторых, в этом сценарии проверяется наличие минимального количества (MINITEMS) элементов командной строки после обработки аргументов. Наконец, сценарий демонстрирует обработку флагов, переопределяющих умолчания.
Пожалуйста, пользуйтесь этим кодом, если вам понадобится преобразовать простой сценарий в сценарий, обрабатывающий параметры и флаги:
#!/bin/bash
MINITEMS=1
function usage
{
echo '
Usage: $0 [-d] [-a author] [-c file.txt] [-h] dir1 [dir1…]
-d debug, don't actual run command
-a author name of the author
-c copyright override default copyright file
-h this help message
'
exit 1
}
# Задание умолчаний:
DEBUG=false
DEBUGCMD=
AUTHOR=
COPYRIGHT=copyright.txt
# Обработка аргументов командной строки