Выбрать главу

При выполнении сценария с корректными и некорректными опциями получаются следующие результаты:

$ 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:class="underline" 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