Разработчик (и) | Различные с открытым исходным кодом и коммерческие разработчики |
---|---|
Первый выпуск | 1986 г.; 34 года назад (1986) |
Операционная система | Unix, Unix-like, IBM i |
Тип | Команда |
getopts
- это встроенная команда оболочки Unix для синтаксического анализа аргументов командной строки. Он предназначен для обработки аргументов командной строки, которые соответствуют рекомендациям по синтаксису служебной программы POSIX, на основе интерфейса C getopt.
. Предшественником getopts
была внешняя программа getopt.
от Unix System Laboratories.
Исходный 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]
Однако способ использования команд сильно различается:
Весной 2004 г. (разработка бета-версии Solaris 10) реализация libc для getopt () был расширен для поддержки длинных опций. В результате эта новая функция была также доступна во встроенной команде getopts
оболочки Bourne Shell. Это инициируется заключенными в скобки суффиксами в строке opt, указывающими длинные псевдонимы.
оболочка Korn и Zsh имеют расширение для длинных аргументов. Первый определяется как в Solaris, а второй реализуется с помощью отдельной команды zparseopts
.
Оболочка Korn дополнительно реализует расширения optstring для параметров, начинающихся с +
вместо -
.
Альтернативой getopts
является расширенная версия Linux getopt
, внешней программы командной строки.
Расширенная версия Linux getopt
имеет дополнительную безопасность getopts
, а также более продвинутые функции. Он поддерживает длинные имена параметров (например, --help
), и параметры не обязательно должны появляться перед всеми операндами (например, command operand1 operand2 -a operand3 -b
разрешено Linux расширенная версия getopt
, но не работает с getopts
). Он также поддерживает экранирование метасимволов для оболочек (таких как tcsh и) и дополнительных аргументов.
ПрограммаФункция | POSIX getopts | Solaris getopts | Unix / BSD getopt | Linux 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 не поддерживает необязательные аргументы:
# разбирать все; в случае неудачи мы освобождаем 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 придает скрипту внешний вид интерфейса 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 экранирует свой вывод, и требуется команда "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 Осталось = ("$ @")
getopts
: командная строка процесса arguments - Справочник по командам и служебным программам, Единая спецификация UNIX, выпуск 7 из The Open Group