Linux и UNIX: программирование в shell. Руководство разработчика
Linux и UNIX: программирование в shell. Руководство разработчика читать книгу онлайн
Данная книга является практическим руководством по программированию интерпретатора Bourne shell -cтандартного командного интерпретатора в UNIX, полностью совместимого с интерпретатором BASH shell в Linux. Книга предназначена для начинающих и опытных программистов и содержит множество полезных примеров, советов и подсказок. С ее помощью читатель сможет быстро научиться создавать shell–сценарии для реальных задач и ситуаций, возникающих в большинстве систем UNIX и Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
$ pg getopt1
#/bin/sh #getopt1
# присвоение значений переменным
ALL=false
HELP=false
FILE=false
VERBOSE=false
while getopts ahfgv OPTION do
case $OPTION in
a)ALL=true
echo "ALL is $ALL"
;;
h)HELP=true
echo "HELP is $HELP"
;;
f)FILE=true
echo "FILE is $FILE"
;;
v)VERBOSE=true
echo "VERBOSE is $VERBOSE"
;;
esac
done
Общий формат команды getopts:
getopts строка_параметров переменная
А теперь используем код из нашего примера:
while getopts ahfgv OPTION
Нетрудно заметить, что цикл while применяется для считывания в командной строке. Параметр строка параметров включает пять указанных опций (-a, —h, —f, —g, —v), а также переменную, которая в данном примере именуется OPTION. Заметьте, что не требуется при определении каждой одиночной опции указывать дефис.
При выполнении сценария с корректными и некорректными опциями получаются следующие результаты:
$ getopt1 -a -h
ALL is true
HELP is true
$ getopt1 -ah
ALL is true
HELP is true
$ getopt1 -a -h -p
ALL is true
HELP is true
./getopt1: illegal option —p
Обратите внимание, что возможно комбинирование различных опций.
20.2.2. Принцип работы команды getopts
Команда getopts считывает строку строка_параметров. При этом она выбирает корректные опции, которые могут быть применены в сценарии.
Команда getopts разыскивает все аргументы, начинающиеся дефисом, и определяет значения всех опций. Затем значение опции сравнивается со строкой строка_параметров. Если соответствие установлено, переменной присваивается значение option. В противном случае переменной присваивается значение ?. Этот процесс продолжается до тех пор, пока не будут обработаны все опции.
Завершив обработку всех аргументов, команда getopts возвращает ненулевое состояние. Это означает, что все аргументы были переданы. Переменная Optind содержит значение последнего обработанного аргумента. В следующем разделе мы рассмотрим, какую пользу эта переменная может принести при обработке аргументов.
20.2.3. Указание значений опций с помощью команды getopts
Иногда для сценариев требуется включение фактического значения одной из опций командной строки. При этом используется команда getopts. Все, что требуется для этого сделать, — вставить двоеточие после буквы опции параметра строка_параметров. Например:
getopts ahfvc: OPTION
Эта команда определяет передачу опций a, h, f, v без указания значений, но опция с должна иметь значение. После указании значения оно будет присвоено переменной OPTARG. Если попытаться передать данную опцию без этого значения, отобразится сообщение об ошибке. Стандартное сообщение об ошибке не является особо информативным, поэтому "подавите" его отображение и выполните следующее:
Укажите двоеточие перед параметром строка_параметров.
while getopts :ahfgvc: OPTION
Используйте оператор usage внутри конструкции case. При этом применяется символ ?, выполняющий функции перехвата ошибок.
case
?) # оператор usage
echo "`basename $0` -[a h f v] -[с value] file"
esac
Ниже представлен измененный сценарий getopt1:
$ pg getopt1
#!/bin/sh
#getopt1
# установка значений переменных
ALL=false
HELP=false
FILE=false
VERBOSE=false
COPIES=0 # значение опции -c равно нулю
while getopts :ahfgvc: OPTION do
case $OPTION in
a)ALL=true
echo "ALL is $ALL"
;;
h)HELP=true
echo "HELP is $HELP"
;;
f}FILE=true
echo "FILE is $FILE"
;;
v)VERBOSE=true
echo "VERBOSE" is $VERBOSE"
;;
C)COPIES=$OPTARG
echo "COPIES is $COPIES"
;;
?) # оператор usage
echo "`basename $0` —[ahfv] —[c value] file" >&2
;;
esac done
При выполнении указанного выше сценария с опцией -c, не содержащей значения, возникает ошибка. В этом случае отображается сообщение usage:
$ getopt1 -ah -с
ALL is true
HELP is true
getopt1 —[ahfv] -[c value] file
Теперь указываются все допустимые опции:
$ getopt1 -ah -с 3
ALL is true HELP is true COPIES is 3
20.2.4. Доступ к значениям
Команда getopts часто применяется для выполнения сценариев резервирования. Благодаря этому пользователь может указывать различные ленточные накопители, используемые для резервирования данных. Ниже приводится образец сценария, использующего команду getopts.
$ pg backups
#!/bin/sh
# backups
QUITE=n
DEVICE=awa
LOGFILE=/tmp/logbackup
usage ()
(
echo "Usage: `basename $0` -d [device] — l [logfile] — q"
exit 1
}
if [ $# - 0 ]
then
usage fi
while getopts :qd:l: OPTION do
case $OPTION in
q) QUIET=y
LOGFILE="/tmp/backup.log"
;;
d) DEVICE=$OPTARG
;;
l) LOGFILE=$OPTARG
;;
?) usage
;;
esac done
echo "you chose the following options..I can now process these"
echo "Quite=$QUITE $DEVICE $LOGFILE"
В данном сценарии при указании опции d нужно присваивать значение. Это значение представляет собой наименование пути для ленточного накопителя. Пользователь может также определить, создавать ли резервную копию, если весь вывод направляется в журнальный файл. Выполнение сценария, использующего указанные ниже входные данные, приводит к следующим результатам:
$ backups -d /dev/rmt0 -q
you chose the following options..
I can now process these Quite=у /dev/rmt0 /tmp/backup.log
После того как команда getopts завершит выполнение проверки, значения, присвоенные OPTARG, могут быть использованы а процессе обычной обработки. Конечно, если в сценарии имеются опции, они должны быть установлены для дальнейшей обработки и проверки значений.
Вот и все, что требуется знать о том, каким образом команда getopts обеспечивает передачу параметров командной строки.
Для фактической обработки файлов используется цикл for, подобно тому, как это было в сценарии tr case, где применялась команда shift для работы с опциями.
Применение команды getopts позволяет радикально сократить объем создаваемого кода по сравнению с использованием метода shift-
20.2.5. Использование команды getopts для преобразования файлов
А теперь воспользуемся сценарием tr_case, который преобразуем с помощью только что изученной команды getopts. Существует единственное отличие между методами getopts и shift, применяемыми для обработки опций командной строки. Это отличие заключается в том, что в первом случае используется опция verbose.
Переменная verbose имеет значение "по", заданное по умолчанию; но при перехвате значения опции командной строки с помощью конструкции case переменной verbose присваивается значение "yes". Отображение команд на экране осуществляется с помощью простой конструкции if.
if [ "VERBOSE"="on" ]; then
echo "doing upper on $LOOP..newflie called $LOOP$EXT"
fi
Если применяется оболочка для системных команд, которые всегда отображают результаты своих действий, то вывод, включающий произвольные ошибки, просто перенаправляется в /dev/null.
command > /dev/null 2>&1
По умолчанию переменная verbose не установлена (нет отображения). Активизировать эту переменную можно посредством опции -v. Например, для преобразования серии файлов myfiles в символы нижнего регистра с помощью VERBOSE применяется следующий формат: