getopts

редактировать
getopts
Разработчик (и) Различные с открытым исходным кодом и коммерческие разработчики
Первый выпуск1986 г.; 34 года назад (1986)
Операционная система Unix, Unix-like, IBM i
Тип Команда

getopts- это встроенная команда оболочки Unix для синтаксического анализа аргументов командной строки. Он предназначен для обработки аргументов командной строки, которые соответствуют рекомендациям по синтаксису служебной программы POSIX, на основе интерфейса C getopt.

. Предшественником getoptsбыла внешняя программа getopt.от Unix System Laboratories.

Содержание
  • 1 История
  • 2 Использование
  • 3 Улучшения
    • 3.1 В различных getopts
    • 3.2 В Linux getopt
    • 3.3 Сравнение
  • 4 Примеры
    • 4.1 Использование старого getopt
    • 4.2 Использование getopts
    • 4.3 Использование Linux getopt
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
История

Исходный getoptимел несколько проблем: он не мог обрабатывать пробелы или метасимволы оболочки в аргументах, и не было возможности отключить вывод сообщений об ошибках.

getoptsбыл впервые представлен в 1986 году в оболочке Bourne, поставляемой с Unix SVR3. Он использует собственные переменные оболочки для отслеживания положения текущей позиции и позиции аргумента, OPTIND и OPTARG, и возвращает имя параметра в переменной оболочки. Более ранние версии оболочки Bourne не имели гетоптов.

В 1995 г. getoptsбыл включен в единую спецификацию UNIX версии 1 / X / Open, выпуск 4 рекомендаций по переносимости. В результате, getoptsтеперь доступен в оболочках, включая оболочку Bourne, оболочку Korn, оболочку Almquist, Bash и Zsh.

Команда getopts также была перенесена в операционную систему IBM i.

Современное использование getoptбыло частично возрождено, в основном из-за расширенной реализации в util-linux. Эта версия, основанная на BSD getopt, не только исправила две жалобы на старый getopt, но также представила возможность синтаксического анализа длинных параметров в стиле GNU и необязательных аргументов для параметров, функции, которых нет в getopts. Однако различные дистрибутивы BSD придерживались старой реализации.

Использование

Краткое описание использования getopt и getopts аналогично его родственнику на языке C :

getopt optstring [параметры] getopts optstring varname [parameters]
  • Часть optstring имеет тот же формат, что и родственник C.
  • Часть параметров просто принимает все, что нужно для анализа getopt. Общее значение - это все параметры «$ @» в оболочке POSIX.
    • Это значение существует в getopts, но используется редко, так как оно может только получить доступ к параметрам оболочки. Однако это полезно при сбросе парсера.
  • Часть varname в getopts именует переменную оболочки, в которой хранится проанализированный параметр.

Однако способ использования команд сильно различается:

  • getopt просто возвращает плоская строка, содержащая разделенные пробелами лексемы, представляющие «нормализованный» аргумент. Затем для наивного анализа используется цикл while.
  • getopts предназначен для повторного вызова, как getopt C. Когда он достигает конца аргументов, он возвращает 1 (ложь оболочки).
Улучшения

В различных getopts

Весной 2004 г. (разработка бета-версии Solaris 10) реализация libc для getopt () был расширен для поддержки длинных опций. В результате эта новая функция была также доступна во встроенной команде getoptsоболочки Bourne Shell. Это инициируется заключенными в скобки суффиксами в строке opt, указывающими длинные псевдонимы.

оболочка Korn и Zsh имеют расширение для длинных аргументов. Первый определяется как в Solaris, а второй реализуется с помощью отдельной команды zparseopts.

Оболочка Korn дополнительно реализует расширения optstring для параметров, начинающихся с +вместо -.

В Linux getopt

Альтернативой getoptsявляется расширенная версия Linux getopt, внешней программы командной строки.

Расширенная версия Linux getoptимеет дополнительную безопасность getopts, а также более продвинутые функции. Он поддерживает длинные имена параметров (например, --help), и параметры не обязательно должны появляться перед всеми операндами (например, command operand1 operand2 -a operand3 -bразрешено Linux расширенная версия getopt, но не работает с getopts). Он также поддерживает экранирование метасимволов для оболочек (таких как tcsh и) и дополнительных аргументов.

Сравнение

ПрограммаФункцияPOSIX getoptsSolaris getoptsUnix / BSD getoptLinux getopt
Разделяет параметры для облегчения анализаДаДаДаДа
Позволяет подавлять сообщения об ошибкахДаДаNoДа
Безопасно с пробелами и метасимволамиДаДаNoДа
Позволяет смешивать операнды с параметрамиNoДаNoДа
Поддерживает длинные параметрыЭмуляцияДаNoДа
Необязательные аргументыОбработка ошибокОбработка ошибокNoДа
Примеры

Предположим, мы создаем загрузчик Википедии на bash, который принимает три параметра и ноль дополнительные аргументы:

wpdown -a название статьи -l [язык] -v

Если возможно, мы разрешаем следующие длинные аргументы:

-a --article -l --language, --lang -v --verbose

Для ясности нет текста справки i s включены, и мы предполагаем, что существует программа, которая загружает любую веб-страницу. Кроме того, все программы имеют вид:

#! / Bin / bash VERBOSE = 0 ARTICLE = '' LANG = en # [ПРИМЕР ЗДЕСЬ] if ((VERBOSE>2)); затем printf '% s \ n' 'Неопциональные аргументы:' printf '% q' "$ {Остающийся [@]]}" fi if ((VERBOSE>1)); then printf 'Загрузка% s:% s \ n' "$ LANG" "$ ARTICLE" fi if [[! $ СТАТЬЯ]]; затем printf '% s \ n' "Нет статей!">2 exit 1 fi save_webpage "https: // $ {LANG}.wikipedia.org / wiki / $ {ARTICLE}"

Использование старого getopt

Старый getopt не поддерживает необязательные аргументы:

# разбирать все; в случае неудачи мы освобождаем args = `getopt 'a: l: v' $ *` || exit # теперь у нас есть очищенные аргументы... замените исходный на него set - $ args while true; do case $ 1 in (-v) ((ГЛАГОЛ ++)); сдвиг;; (-a) СТАТЬЯ = 2 доллара США; сдвиг 2 ;; (-l) LANG = 2 доллара США; сдвиг 2 ;; (--) сдвиг; перемена;; (*) выход 1 ;; # error esac done Осталось = ("$ @")

Этот скрипт также прерывает заголовок любой статьи с пробелом или метасимволом оболочки (например? или *) в нем.

Использование getopts

Getopts придает скрипту внешний вид интерфейса C, хотя в POSIX необязательные аргументы все еще отсутствуют:

#! / Bin / sh while getopts ': a : l: v 'opt; do case $ opt in (v) ((VERBOSE ++)) ;; (а) СТАТЬЯ = $ OPTARG ;; (l) LANG = $ OPTARG ;; (:) # "необязательные аргументы" (отсутствует обработка аргументов-опций) case $ OPTARG in (a) exit 1 ;; # ошибка в соответствии с нашим синтаксисом (l): ;; # приемлемо, но ничего не делает esac ;; esac done shift "$ OPTIND" # осталось "$ @"

Поскольку мы больше не работаем напрямую с параметрами оболочки, нам больше не нужно их сдвигать. Однако теперь требуется операция нарезки, чтобы получить оставшиеся аргументы.

Возможно, но утомительно эмулировать поддержку длинных аргументов, рассматривая --fastкак аргумент fastдля параметра -.

Использование Linux getopt

Linux getopt экранирует свой вывод, и требуется команда "eval", чтобы оболочка интерпретировала его. Остальное без изменений:

# Мы используем "$ @" вместо $ * для сохранения информации о границах аргументов ARGS = $ (getopt -o 'a: l :: v' --long 'article:, language ::, lang ::, verbose '- "$ @") || выйти из eval "set - $ ARGS", пока true; do case $ 1 in (-v | --verbose) ((VERBOSE ++)); сдвиг;; (-a | --article) СТАТЬЯ = 2 доллара США; сдвиг 2 ;; (-l | --lang | --language) # опциональный дескриптор: getopt нормализует его до пустой строки if [-n "$ 2"]; тогда LANG = 2 $; сдвиг; fi shift ;; (--) сдвиг; перемена;; (*) выход 1 ;; # error esac done Осталось = ("$ @")
См. также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-21 07:21:05
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте