После того как команда 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 применяется следующий формат:
tr_case -1 -v myfilel myfile2…
либо
tr_case -v -1 myfilel myfile2…
Сразу же бросается в глаза заметное сокращение объема программного кода при использовании команды getopts. Код, применяемый для обработки файлов, аналогичен коду с командой shift.
Пример сценария:
$ pg tr_case2
#!/bin/sh
#tr_case2
# преобразование регистра, используется команда getopts
ЕХТ=""
TRCASE=""
FLAG=""
OPT="no"
VERBOSE="off"
while getopts :luv OPTION
do
case $OPTION in
l)
TRCASE="lower"
EXT=".LC"
OPT=yes
;;
u)
TRCASE="upper"
EXT=".UC"
OPT=yes
;;
v)
VERBOSE=on
;;
\?) echo "usage: `basename $0`: -[l|u] —v file[s]"
exit 1
;;
esac
done
#следующий аргумент, пожалуйста
shift `expr $OPTIND -1`
#есть аргументы ???
if [ "$#"="0" ] || [ "$OPT"="no" ] then
echo "usage: `basename $0`: -[l|u] — v file[s]" >&2
exit 1
fi
for LOOP in "$@" do
if [ ! — f $LOOP ] then
echo "`basename $0`: Error cannot find file $LOOP" >&2
exit 1
fi
echo $TRCASE $LOOP
case $TRCASE in
lower)
if [ "VERBOSE"="on" ]; then
echo "doing…lower on $LOOP..newflie called $LOOP$EXT"
fi
cat $LOOP | tr "[a‑z]" "[A‑Z]" >$LOOP$EXT
;;
upper) if [ "VERBOSE"="on" ]; then
echo "doing upper on $LOOP..newflie called $LOOP$EXT"
fi
cat $LOOP | tr "[A‑Z]" "[a‑z]" >$LOOP$EXT
;;
esac
done
При указании опций командной строки в сценариях было бы неплохо придерживаться соглашений о наименовании, принятых в UNIX либо Linux. В следующей таблице описываются некоторые общие опции и их значения.
| Опция | Значение |
| -a | добавление |
| -c | счетчик, копирование |
| -d | каталог, устройство |
| -e | выполнение |
| -f | имя файла, форсировать |
| -h | справка |
| -i | игнорировать регистр |
| -1 | журнальный файл |
| -o | полный вывод |
| -q | полностью |
| -p | путь |
| -v | многословный |
20.3. Заключение
Способность корректно обрабатывать опции командной строки придает сценариям профессиональный вид. Для пользователя эти опции выглядят точно так же, как любые другие системные команды. В этой главе были рассмотрены два метода, предназначенные для обработки опций командной строки, — shift и getopts. Размер программного кода, необходимого для внедрения метода getopts, является намного меньшим, чем в случае использования метода shift.