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

<p><emphasis><strong>20.2.4. Доступ к значениям</strong></emphasis></p>

Команда 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-

<p><emphasis><strong>20.2.5. Использование команды getopts для преобразования файлов</strong></emphasis></p>

А теперь воспользуемся сценарием 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…

либо

Перейти на страницу:

Похожие книги