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
Команда 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-
А теперь воспользуемся сценарием 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 применяется следующий формат:
tr_case -1 -v myfilel myfile2…
либо