Jump to content

получить

получить
Разработчик(и) Различные с открытым исходным кодом и коммерческие разработчики разработчики
Первоначальный выпуск 1986 год ; 38 лет назад ( 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=("${@}")

См. также

[ редактировать ]
  1. ^ Jump up to: а б с getopt(1) FreeBSD по основным командам Руководство
  2. ^ Масчек, Свен. «Традиционная семья Борнов Шелл» . Проверено 1 декабря 2010 г.
  3. ^ Jump up to: а б «гетопс» . Открытая группа (POSIX 2018) .
  4. ^ «Справочное руководство по Bash» .
  5. ^ ИБМ . «Программирование Qshell в IBM System i версии 7.2» (PDF) . ИБМ . Проверено 05 сентября 2020 г.
  6. ^ Jump up to: а б getopt(1) Linux по основным командам Руководство
  7. ^ "getopt(3)" . Информационная библиотека Oracle Solaris 11.2 .
  8. ^ Jump up to: а б «ksh getopts — параметры анализа из командной строки сценария оболочки» . www.mkssoftware.com .
  9. ^ zshmodules(1) Linux по основным командам Руководство
  10. ^ «Простой парсер CLI в Bash» .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 02ea156b6cb0f9dc3cde055550907945__1716481020
URL1:https://arc.ask3.ru/arc/aa/02/45/02ea156b6cb0f9dc3cde055550907945.html
Заголовок, (Title) документа по адресу, URL1:
getopts - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)