2013-08-08 4 views
3

Я использую встроенный «getopts» ksh для обработки параметров командной строки, и я ищу чистый/стандартный способ «отменить» вариант в командной строке , Я не знаю, является ли это техническим вопросом о getopts или более вопросом стиля/стандартов. В любом случае, я понимаю, что getopts обрабатывает свои аргументы (по умолчанию $ *) слева направо, и я надеюсь использовать это, чтобы вторая спецификация опции «выключила» опцию.ksh «getopts» - снятие опции

Для параметров, которые принимают аргумент параметра, это не проблема. В моем getopts обработки дела о я просто говорю, для «-x» варианта, например:

x) x_arg=$OPTARG 
    ;; 

и последний экземпляр «-x» в командной строке выигрывает, что это то, что я хочу.

Проблема связана с параметрами, которые не принимают аргумент опции. Если опция просто переключатель/флаг, то в моем случае заявление будет просто иметь что-то вроде:

x) x_specified=1 
    ;; 

С опцией, как это все, что я могу действительно сделать, это добавить «-X» снова в командной строке, и то же самое происходит: «x_specified = 1» выполняется снова. Каков наилучший/простой/самый простой/стандартный способ «unset x_specified»? Это мой вопрос.

Я надеялся вызвать функцию getopts, которая позволяет либо «+», либо «-» предшествовать буквенным обозначениям опций, но кажется, что в цикле обработки getopts нет возможности указать, были ли использованы «+» или «-» , Если бы был способ сказать, я мог бы принять стандарт, который «+» означает отключить настройку. Другая вещь, которую я мог бы сделать, это что-то вроде:

x) if [[ -z $x_specified ]] ; then 
     x_specified=1 
    else 
     unset x_specified 
    fi 
    ;; 

Теперь опция -x будет переключаться; каждый раз, когда он отображается в командной строке, настройка изменяется. Тем не менее, мне бы хотелось, чтобы в командной строке говорилось: «выключите параметр -x», а не просто «переключите параметр -x». Я мог бы также выбрать другую букву, например. «X», как способ отключить его, но многие из моих сценариев уже используют как в верхнем, так и в нижнем регистре версии одной и той же буквы, чтобы обозначать разные вещи, и если мне нужно выбрать другую случайную букву, чтобы означать «поворот» off -x ", то это не очень мнемонично, и мои скрипты достаточно трудны, чтобы узнать, как их использовать.

Наконец, вы можете спросить: «Если вы хотите -x отключиться в командной строке, то почему вы включаете его в первую очередь?» Обработка параметров в моих сценариях проходит через многоэтапный процесс. Проверяются параметры командной строки, а также проверяется файл конфигурации для параметров, и между ними есть приоритет. Все это отлично подходит для опций, которые принимают аргумент параметра, но схема разваливается для вариантов, которые этого не делают.

ответ

1

У меня ksh93, и это позволяет + варианты, если строка_опций начинается с "+":

while getopts +abc opt; do 
    echo "have option '$opt'" 
done 

Запуск этого:

$ ./args.ksh -a -b -c +b -b foo 
have option 'a' 
have option 'b' 
have option 'c' 
have option '+b' 
have option 'b' 
$ ksh --version 
    version   sh (AT&T Research) 93u+ 2012-08-01 

Одна неясность я вижу в man: он говорит, что опция «:» также должна быть «ведущим» символом в optstring.

http://linux.die.net/man/1/ksh93

+0

Это хорошо работает. Если у opt var есть ведущий «+», то я могу сделать то, что мне нужно сделать в моем цикле getopts. Что касается ведущей «:» в строке опций, я думаю, что это просто для управления поведением, когда отображается недопустимая опция. Итак, если вы хотите разрешить «+», а также «-» вводить параметры, добавьте «+» в начало строки опций. Если вы также хотите вызвать специальное поведение, связанное с «:», то добавьте «: +» в начало строки опций. –