WikiDer > Getopts
Эта статья нужны дополнительные цитаты для проверка. (Февраль 2017 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
Разработчики) | Разные Открытый исходный код и коммерческий Разработчики |
---|---|
изначальный выпуск | 1986 |
Операционная система | Unix, Unix-подобный, IBM i |
Тип | Команда |
Getopts
это встроенный Оболочка Unix команда для разбора аргументы командной строки. Он предназначен для обработки аргументов командной строки, которые соответствуют рекомендациям по синтаксису служебной программы POSIX, основанным на интерфейсе C Getopt.
Предшественник Getopts
была внешняя программа Getopt
к Лаборатории Unix System.
История
Оригинал Getopt
было несколько проблем: он не мог обрабатывать пробелы или метасимволы оболочки в аргументах, и не было возможности отключить вывод сообщений об ошибках.[1]
Getopts
был впервые представлен в 1986 году в Оболочка Борна поставляется с Unix SVR3. Он использует собственные переменные оболочки для отслеживания положения текущей позиции и позиции аргумента, OPTIND и OPTARG, и возвращает имя параметра в переменной оболочки.[2] Более ранние версии оболочки Борна не имели Getopts.
В 1995 г. Getopts
был включен в Единая спецификация UNIX версия 1 / X / Открыть Руководство по переносимости Выпуск 4.[3] Как результат, Getopts
теперь доступен в оболочках, включая Оболочка Борна, KornShell, Раковина альмквиста, Баш и Zsh.[4]
В Getopts команда также была перенесена в IBM i Операционная система.[5]
Современное использование Getopt
был частично возрожден в основном благодаря расширенной реализации в утилита-Linux. Эта версия, основанная на BSD Getopt
, не только исправили две жалобы на старые Getopt
, но также представила возможность синтаксического анализа длинных параметров в стиле GNU и дополнительных аргументов для параметров, функций, которые Getopts
не хватает.[6] Однако различные дистрибутивы BSD придерживались старой реализации.[1]
использование
Краткое описание использования getopt и getopts аналогично его брат C:
Getopt optstring [параметры]Getopts optstring varname [параметры]
- В optstring часть имеет тот же формат, что и родственник C.
- В параметры part просто принимает все, что нужно проанализировать. Общее значение - это все параметры, "$@" в оболочке POSIX.
- Это значение существует в getopts, но редко используется, так как оно может просто получить доступ к параметрам оболочки. Однако это полезно при сбросе парсера.
- В varname часть getopts именует переменную оболочки, в которой хранится проанализированный параметр.
Однако способ использования команд сильно различается:
- getopt просто возвращает плоскую строку, содержащую разделенные пробелами токены, представляющие «нормализованный» аргумент. Затем для наивного анализа используется цикл while.[1]
- getopts предназначен для повторного вызова, как getopt C. Когда он достигает конца аргументов, он возвращает 1 (ложь оболочки).[3]
Улучшения
В различных гетоптах
Весной 2004 г. (разработка бета-версии Solaris 10) реализация libc для getopt () был улучшен для поддержки длинных опций. В результате эта новая функция была также доступна во встроенной команде Getopts
оболочки Борна. Это запускается суффиксами в скобках в optstring указание длинных псевдонимов.[7]
KornShell и Zsh оба имеют расширение для длинных аргументов. Первый определяется как в Solaris,[8] а последний реализуется через отдельный zparseopts
команда.[9]
KornShell дополнительно реализует optstring расширения для параметров, начинающихся с +
вместо -
.[8]
В Linux getopt
Альтернатива Getopts
это расширенная версия Linux Getopt
, внешняя программа командной строки.
Расширенная версия Linux Getopt
имеет дополнительную безопасность Getopts
плюс более продвинутые функции. Он поддерживает длинные имена параметров (например, --помощь
), и параметры не обязательно должны появляться перед всеми операндами (например, команда операнд1 операнд2 -a операнд3 -b
разрешено расширенной версией Linux Getopt
но не работает с Getopts
). Он также поддерживает экранирование метасимволов для оболочек (например, tcsh и POSIX sh) и необязательные аргументы.[6]
Сравнение
Программа Особенность | POSIX getopts | Getopts для Solaris | Unix / BSD getopt | Linux getopt |
---|---|---|---|---|
Разделяет параметры для облегчения анализа | да | да | да | да |
Позволяет подавлять сообщения об ошибках | да | да | Нет | да |
Сейф с пробелами и метасимволами | да | да | Нет | да |
Позволяет смешивать операнды с опциями | Нет | да | Нет | да |
Поддерживает длинные варианты | Эмуляция | да | Нет | да |
Необязательные аргументы | Обработка ошибок | Обработка ошибок | Нет | да |
Примеры
Предположим, мы создаем загрузчик Википедии на bash, который принимает три параметра и ноль дополнительных аргументов:
wpdown -a название статьи -l [язык] -v
По возможности мы допускаем следующие длинные аргументы:
-a --article-l --language, --lang-v --verbose
Для ясности текст справки не включен, и мы предполагаем, что существует программа, которая загружает любую веб-страницу. Кроме того, все программы имеют вид:
#! / bin / bashПОДРОБНЫЙ=0СТАТЬЯ=''LANG=en# [ПРИМЕР ЗДЕСЬ]если ((ГЛАГОЛЬНАЯ> 2)); тогда printf '% s' 'Неопциональные аргументы:' printf "% q" "${осталось[@]]}"фиесли ((ГЛАГОЛЬНАЯ> 1)); тогда printf 'Загрузка% s:% s' "$ LANG" "$ СТАТЬЯ"фиесли [[ ! $ СТАТЬЯ ]]; тогда printf '% s' "Нет статей!">&2 выход 1фиsave_webpage "https: //${LANG}.wikipedia.org / wiki /${СТАТЬЯ}"
Использование старого getopt
Старый getopt не поддерживает необязательные аргументы:
# все разбирать; если это не удается, мы вносим залогаргументы=`Getopt 'а: л: в' $*` || выход# теперь у нас есть очищенные аргументы ... замените им оригиналнабор -- $ argsпока истинный; делать дело $1 в (-v) ((ГЛАГОЛ ++)); сдвиг;; (-а) СТАТЬЯ=$2; сдвиг 2;; (-l) LANG=$2; сдвиг 2;; (--) сдвиг; перемена;; (*) выход 1;; # ошибка esacсделаноосталось=("$@")
Этот скрипт также прерывается с любым заголовком статьи, содержащим пробел или метасимвол оболочки (например,? Или *).
Использование getopts
Getopts придает скрипту внешний вид интерфейса C, хотя в POSIX необязательные аргументы все еще отсутствуют:
#! / bin / shпока Getopts ': a: l: v' выбрать; делать дело $ opt в (v) ((ГЛАГОЛ ++));; (а) СТАТЬЯ=$ OPTARG;; (л) LANG=$ OPTARG;; (:) # "необязательные аргументы" (отсутствует обработка аргументов-опций) дело $ OPTARG в (а) выход 1;; # ошибка, согласно нашему синтаксису (л) :;; # приемлемо, но ничего не делает esac;; esacсделаносдвиг "$ OPTIND"# осталось "$ @"
Поскольку мы больше не работаем напрямую с параметрами оболочки, нам больше не нужно их менять. Однако теперь требуется операция нарезки, чтобы получить оставшиеся аргументы.
Возможно, но утомительно имитировать поддержку длинных аргументов, рассматривая --быстрый
как аргумент быстрый
к опции -
.[10]
Использование Linux getopt
Linux getopt экранирует свой вывод, и требуется команда eval, чтобы оболочка интерпретировала его. В остальном без изменений:
# Мы используем "$ @" вместо $ * для сохранения информации о границах аргументовARGS=$(getopt -o 'a: l :: v' --длинный 'article:, language ::, lang ::, verbose' -- "$@") || выходоценка "набор -- $ ARGS"пока истинный; делать дело $1 в (-v|--подробный) ((ГЛАГОЛ ++)); сдвиг;; (-а|--статья) СТАТЬЯ=$2; сдвиг 2;; (-l|--lang|--язык) # handle optional: getopt нормализует его в пустую строку если [ -n "$2" ]; тогда LANG=$2; сдвиг; фи сдвиг;; (--) сдвиг; перемена;; (*) выход 1;; # ошибка esacсделаноосталось=("$@")
Смотрите также
Рекомендации
- ^ а б c FreeBSD Общие команды Руководство –
- ^ Mascheck, Свен. «Традиционное семейство ракушек Борна». Получено 2010-12-01.
- ^ а б "getopts". Открытая группа (POSIX 2018).
- ^ https://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtin
- ^ IBM. "Qshell для программирования IBM System i версии 7.2" (PDF). Получено 2020-09-05.
- ^ а б Linux Общие команды Руководство –
- ^ "getopt (3)". Информационная библиотека Oracle Solaris 11.2.
- ^ а б "ksh getopts - параметры синтаксического анализа из командной строки сценария оболочки". www.mkssoftware.com.
- ^ Linux Общие команды Руководство –
- ^ https://gist.github.com/webb/ff380b0eee96dafe1c20c2a136d85ef0
внешняя ссылка
- Единая спецификация UNIX, Выпуск 7 из Открытая группа : аргументы командной строки процесса - Справочник по командам и утилитам,
Этот Unix-связанная статья является заглушка. Вы можете помочь Википедии расширяя это. |