разбор параметров командной строки в скриптах с помощью getopts


elide - Posted on 18 Январь 2006

для разбора параметров в скриптах чаще всего используются две программы - getopt и getopts
первая для начала довольно сложна и излишне функциональна, поэтому рассмотрим разбор на примере более простой getopts
стандартный скелет скрипта

#!/bin/sh
#
while getopts OPTIONS_LIST option
do
    case $option in
     OPTION)    ACTION;;
    esac
done
shift $((OPTIND - 1))
###
ТЕЛО СКРИПТА
###

getopts понимает только простые однобуквенные опции, либо вообще без, либо с обязательным аргументом.

все опции, которые программа должна обрабатывать указываются вместо OPTIONS_LIST. если опция требует обязательный параметр, то после ее буквы надо поставить двоеточие.
ПРИМЕР: rvo:x
такая строчка показывает, что надо обрабатывать опции -r, -v, -o и -x, причем -o требует аргумента.

далее указывается переменная, куда будет сохранятся найденная опция. в данном случае это option
для обработки добавляем внутрь case строчки вида НУЖНАЯ ОПЦИЯ) ДЕЙСТВИЕ ;;
ПРИМЕР:
r) echo "Option -r found!" ;;

если найдена неправильная опция, то в option будет записан знак вопроса. если у опции есть аргумент, он будет записан в переменную $OPTARG
ПРИМЕР:
o) echo "Option -o found, with argument '$OPTARG'!" ;;

вот собственно и весь разбор. строчка shift $((OPTIND - 1)) сдвигает позиционные параметры так, что в $1 оказывается первый параметр не являющийся опцией, что очень удобно, если, к примеру, после опций передается имя файла, который надо обработать...

0
Ваша оценка: Ничего
1) надо сказать что getopts встроена в шел (bash,zsh), хотя на *BSD системах есть отдельная программа 2) ты забыл указать преимущетва перед таким подходом Ж:-)
while : ; do
    case $1 in
       OPTION) ACTION [shift];;
       *) break;;
    esac
    shift
done
премущество то что в первом вариантре опции без параметров можно комбинировать например как в том примере -evo будет тоже самое что -e -v -o -- Signature invent in progress 19% #.........

да дело даже не в этом...
основной плюс - обработка ошибок, типа неверных опций или пропуска параметров...

это в том варианте так же это все делается без проблем
--
Signature invent in progress 19% #.........