получить
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2017 г. ) |
Разработчик(и) | Различные с открытым исходным кодом и коммерческие разработчики разработчики |
---|---|
Первоначальный выпуск | 1986 год |
Операционная система | Unix , Unix-подобные , IBM i |
Тип | Команда |
getopts
— это встроенная команда оболочки Unix для анализа аргументов командной строки . Он предназначен для обработки аргументов командной строки, которые соответствуют рекомендациям по синтаксису утилиты POSIX, на основе интерфейса C getopt .
Предшественник getopts
была внешняя программа getopt
от Unix System Laboratories .
История
[ редактировать ]Оригинал getopt
имело несколько проблем: он не мог обрабатывать пробелы или метасимволы оболочки в аргументах, а также не было возможности отключить вывод сообщений об ошибках. [ 1 ]
getopts
Впервые был представлен в 1986 году в оболочке Bourne, поставляемой с Unix SVR3. Он использует собственные переменные оболочки для отслеживания положения текущих позиций и позиций аргументов. ОПТИНД и OPTARG и возвращает имя параметра в переменной оболочки. [ 2 ] Более ранние версии оболочки Bourne не имели getopts .
В 1995 году getopts
был включен в Единую спецификацию UNIX версии 1 / X/Open Portability Guidelines Issue 4. [ 3 ] Как результат, getopts
теперь доступен в оболочках, включая Bourne , KornShell , Almquist , Bash и Zsh . [ 4 ]
The Команда getopts также была перенесена в операционную систему IBM i . [ 5 ]
Современное использование getopt
был частично возрожден в основном благодаря улучшенной реализации в util-linux . Эта версия, основанная на BSD getopt
, не только исправил две жалобы на старую getopt
, но также представила возможность анализа длинных опций в стиле GNU и необязательных аргументов для опций, функций, которые getopts
не хватает. [ 6 ] Однако различные дистрибутивы BSD придерживались старой реализации. [ 1 ]
Использование
[ редактировать ]Краткое описание использования getopt и getopts аналогично их родному брату C :
getopt optstring [parameters] getopts optstring varname [parameters]
- Часть optstring имеет тот же формат, что и родственная часть C.
- Часть параметров просто принимает все, что getopt хочет проанализировать. Общее значение – это все параметры, «$@» в оболочке POSIX.
- Это значение существует в getopts, но используется редко, поскольку оно позволяет получить доступ только к параметрам оболочки. Однако это полезно при сбросе анализатора.
- Часть varname в getopts называет переменную оболочки , в которой будет храниться анализируемая опция.
Однако способы использования команд сильно различаются:
- getopt просто возвращает плоскую строку, содержащую токены, разделенные пробелами, представляющие «нормализованный» аргумент. Затем для его естественного анализа используется цикл while. [ 1 ]
- getopts предназначен для многократного вызова, как и getopt в C. Когда он достигает конца аргументов, он возвращает 1 (оболочка false). [ 3 ]
Улучшения
[ редактировать ]В различных getopts
[ редактировать ]Весной 2004 года (разработка бета-версии Solaris 10) была реализована реализация libc для getopt() был улучшен для поддержки длинных опций. В результате эта новая функция стала доступна и во встроенной команде getopts
компании Bourne Shell. Это вызывается суффиксами в скобках в строке optstring, определяющими длинные псевдонимы. [ 7 ]
У KornShell и Zsh есть расширение для длинных аргументов. Первый определяется как в Solaris, [ 8 ] тогда как последний реализуется через отдельный zparseopts
команда. [ 9 ]
KornShell дополнительно реализует расширения optstring для параметров, начинающихся с +
вместо -
. [ 8 ]
В Linux getopt
[ редактировать ]Альтернатива getopts
это расширенная версия Linux getopt
, внешняя программа командной строки.
Расширенная версия Linux getopt
имеет дополнительную безопасность getopts
плюс более продвинутые функции. Он поддерживает длинные имена опций (например, --help
), и параметры не обязательно должны появляться перед всеми операндами (например, command operand1 operand2 -a operand3 -b
разрешено расширенной версией Linux getopt
но не работает с getopts
). Он также поддерживает экранирование метасимволов для оболочек (например, tcsh и POSIX sh ) и необязательных аргументов. [ 6 ]
Сравнение
[ редактировать ]Программа Особенность |
POSIX-получение | Солярис/кш getopts | Получить выбор в Unix/BSD | Linux getopt |
---|---|---|---|---|
Параметры разделения для облегчения анализа | Да | Да | Да | Да |
Позволяет подавлять сообщения об ошибках | Да | Да | Нет | Да |
Безопасно с пробелами и метасимволами | Да | Да | Нет | Да |
Позволяет операндам смешиваться с опциями | Нет | Да | Нет | Да |
Поддерживает длинные параметры | Эмуляция | Да | Нет | Да |
Необязательные аргументы | Обработка ошибок | Обработка ошибок | Нет | Да |
Примеры
[ редактировать ]Предположим, мы создаем загрузчик Википедии в bash, который принимает три параметра и ноль дополнительных аргументов:
wpdown -a article name -l [language] -v
Когда это возможно, мы допускаем следующие длинные аргументы:
-a --article -l --language, --lang -v --verbose
Для ясности текст справки не включен, и мы предполагаем, что существует программа, которая загружает любую веб-страницу. Кроме того, все программы имеют вид:
#!/bin/bash
verbose=0
article=
lang=en
# [EXAMPLE HERE]
if ((verbose > 2)); then
printf '%s\n' 'Non-option arguments:'
printf '%q ' "${remaining[@]]}"
fi
if ((verbose > 1)); then
printf 'Downloading %s:%s\n' "$lang" "$article"
fi
if [[ ! $article ]]; then
printf '%s\n' "No articles!" >&2
exit 1
fi
save_webpage "https://${lang}.wikipedia.org/wiki/${article}"
Использование старого getopt
[ редактировать ]Старый getopt не поддерживает необязательные аргументы:
# parse everything; if it fails we bail
args=`getopt 'a:l:v' $*` || exit
# now we have the sanitized args... replace the original with it
set -- $args
while true; do
case $1 in
(-v) ((verbose++)); shift;;
(-a) article=$2; shift 2;;
(-l) lang=$2; shift 2;;
(--) shift; break;;
(*) exit 1;; # error
esac
done
remaining=("$@")
Этот скрипт также не будет работать с любым заголовком статьи, содержащим пробел или метасимвол оболочки (например, ? или *).
Использование getopts
[ редактировать ]Getopts придает сценарию внешний вид интерфейса C, хотя в POSIX дополнительные аргументы по-прежнему отсутствуют:
#!/bin/sh
while getopts ':a:l:v' opt; do
case $opt in
(v) ((verbose++));;
(a) article=$OPTARG;;
(l) lang=$OPTARG;;
(:) # "optional arguments" (missing option-argument handling)
case $OPTARG in
(a) exit 1;; # error, according to our syntax
(l) :;; # acceptable but does nothing
esac;;
esac
done
shift "$((OPTIND - 1))"
# remaining is "$@"
Поскольку мы больше не работаем с параметрами оболочки напрямую, нам больше не нужно перемещать их внутри цикла. Однако требуется операция среза, чтобы удалить проанализированные параметры и оставить оставшиеся аргументы.
Эмулировать поддержку длинных опций флагов довольно просто, обрабатывая --fast
как аргумент fast
к варианту -
. То есть, -:
добавляется в строку optstring, и -
добавляется в качестве случая для opt
, в пределах которого OPTARG
оценивается на соответствие fast
. Поддержка длинных опций с помощью аргументов более утомительна, но возможна, если опции и аргументы очерчены = . [ 10 ]
Использование Linux getopt
[ редактировать ]Linux getopt экранирует свои выходные данные, и для того, чтобы оболочка интерпретировала их, необходима команда «eval». Остальное без изменений:
#!/bin/bash
# We use "${@}" instead of "${*}" to preserve argument-boundary information
args=$(getopt --options 'a:l::v' --longoptions 'article:,lang::,language::,verbose' -- "${@}") || exit
eval "set -- ${args}"
while true; do
case "${1}" in
(-v | --verbose)
((verbose++))
shift
;;
(-a | --article)
article=${2}
shift 2
;;
(-l | --lang | --language)
# handle optional: getopt normalizes it into an empty string
if [[ -n ${2} ]] ; then
lang=${2}
fi
shift 2
;;
(--)
shift
break
;;
(*)
exit 1 # error
;;
esac
done
remaining_args=("${@}")
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б с FreeBSD по основным командам Руководство –
- ^ Масчек, Свен. «Традиционная семья Борнов Шелл» . Проверено 1 декабря 2010 г.
- ^ Jump up to: а б «гетопс» . Открытая группа (POSIX 2018) .
- ^ «Справочное руководство по Bash» .
- ^ ИБМ . «Программирование Qshell в IBM System i версии 7.2» (PDF) . ИБМ . Проверено 05 сентября 2020 г.
- ^ Jump up to: а б Linux по основным командам Руководство –
- ^ "getopt(3)" . Информационная библиотека Oracle Solaris 11.2 .
- ^ Jump up to: а б «ksh getopts — параметры анализа из командной строки сценария оболочки» . www.mkssoftware.com .
- ^ Linux по основным командам Руководство –
- ^ «Простой парсер CLI в Bash» .
Внешние ссылки
[ редактировать ]- Единая спецификация UNIX , версия 4 от The Open Group : аргументы командной строки процесса — Справочник по командной строке и утилитам,