argparse - обработка параметров, переданных в скрипт или функцию fish
Резюме
argparse [OPTIONS] OPTION_SPEC ... -- [ARG ...]
Описание
Эта команда упрощает обработку аргументов для скриптов и функций fish. Вы передаёте аргументы, определяющие известные параметры, за которыми следует буквальный --, а затем аргументы для парсинга (которые также могут включать буквальный --). argparse затем устанавливает переменные, указывающие переданные параметры со значениями, и устанавливает $argv для оставшихся аргументов. См. раздел использование ниже.
Каждое описание параметра (OPTION_SPEC) написано на языке предметной области, описанном ниже. Все OPTION_SPEC должны появляться после всех флагов argparse и перед --, которые отделяют их от аргументов, подлежащих парсингу.
Каждый параметр, видимый в списке ARG, приведет к созданию переменных с именем _flag_X, где X — буква короткого флага, а имя длинного флага (если они определены). Например, параметр --help может привести к тому, что argparse определит одну переменную с именем _flag_h и другую с именем _flag_help.
Переменные будут установлены с локальным объёмом (то есть, как будто скрипт выполнил set -l _flag_X). Если флаг является булевым (то есть, он просто передаётся или нет, у него нет значения), значениями являются короткий и длинный флаги, увиденные. Если параметр не является булевым, значениями будут ноль или более значений, соответствующих значениям, собранным при обработке списка ARG. Если флаг не был увиден, переменная флага не будет установлена.
Параметры
Доступны следующие argparse параметры. Они должны появляться перед всеми OPTION_SPEC:
- -n или --name
-
Имя команды для использования в сообщениях об ошибках. По умолчанию будет использоваться текущее имя функции или
argparseесли выполняется вне функции. - -x или --exclusive OPTIONS
-
Список параметров, которые являются взаимоисключающими, разделённый запятыми. Вы можете использовать это более одного раза для определения нескольких наборов взаимоисключающих параметров.
- -N или --min-args NUMBER
-
Минимальное количество допустимых аргументов, не являющихся параметрами. По умолчанию ноль.
- -X или --max-args NUMBER
-
Максимальное количество допустимых аргументов, не являющихся параметрами. По умолчанию бесконечность.
- -i или --ignore-unknown
-
Игнорирует неизвестные параметры, сохраняя их и их аргументы в $argv.
- -s или --stop-nonopt
-
Приводит к остановке сканирования аргументов, как только будет встречен первый аргумент, не являющийся параметром. Среди прочего, это полезно для реализации подкоманд, имеющих собственные параметры.
- -h или --help
-
Отображает справку по использованию этой команды.
Использование
Для использования этой команды передайте описания параметров (OPTION_SPEC), обязательный -- и затем аргументы для парсинга.
Простой пример:
argparse --name=my_function 'h/help' 'n/name=' -- $argv or return
Если $argv пусто, то нет ничего для парсинга, и argparse возвращает ноль, чтобы указать успех. Если $argv не пусто, то оно проверяется на наличие флагов -h, --help, -n и --name. Если они найдены, они удаляются из аргументов, и устанавливаются локальные переменные с именем _flag_OPTION, чтобы скрипт мог определить, какие параметры были замечены. Если $argv не содержит ошибок, например, отсутствующего обязательного значения для параметра, то argparse завершается со статусом ноль. В противном случае он записывает соответствующие сообщения об ошибках в stderr и завершается со статусом один.
or return означает, что функция возвращает статус argparse в случае ошибки, поэтому, если argparse завершился успешно.
Аргумент -- обязателен. Вы не обязаны включать какие-либо описания параметров или аргументы после --, но вы должны включить --. Например, это допустимо:
set -l argv foo argparse 'h/help' 'n/name' -- $argv argparse --min-args=1 -- $argv
Но это не так:
set -l argv argparse 'h/help' 'n/name' $argv
Первый -- позволяет команде argparse надёжно разделить описания параметров и параметры для самой команды argparse (например, --ignore-unknown) и аргументы команды, поэтому он обязателен.
Определения параметров
Каждое определение параметра состоит из:
- Необязательного буквенно-цифрового короткого флага, за которым следует
/если короткий флаг может быть использован тем, кто вызывает вашу команду или, для обратной совместимости,-если он не должен быть отображён как допустимый короткий флаг (в этом случае он также не будет отображаться как переменная флага). - Необязательное длинное имя флага, которое, если его нет, может быть использован короткий флаг, и если и это не так, то выводится сообщение об ошибке
-
Ничего, если флаг является булевым, не принимающим аргумент, или целым числом, или
- = если требуется значение и сохраняется только последнее вхождение флага, или
- =? если значение необязательно и сохраняется только последнее вхождение флага, или
- =+ если требуется значение и сохраняется каждое вхождение флага.
- Необязательно
!, за которым следует скрипт fish для проверки значения. Обычно это будет функция для выполнения. Если выходной статус равен нулю, значение флага является допустимым. Если ненулевой, значение недействительно. Любые сообщения об ошибках должны быть выведены на stdout (а не stderr). Подробности см. в разделе Проверка значений флага.
См. команду fish_opt для более удобного, но более подробного способа создания определений параметров.
Если флаг не встречен при парсинге аргументов, соответствующие переменные _flag_X не будут установлены.
Целочисленный флаг
Иногда команды принимают числа напрямую в качестве параметров, например foo -55. Чтобы это позволить, можно использовать модификатор #, так что любое целое число будет пониматься как этот флаг, и последнее число будет передаваться в качестве его значения (как если бы = был использован).
# должен следовать за буквой короткого флага (если есть), и другие модификаторы, такие как =, не допускаются, за исключением - (для обратной совместимости):
m#maximum
Это не читает числа, указанные как +NNN, а только те, которые выглядят как флаги - -NNN.
Примечание: Необязательные аргументы
Параметр, определённый с =?, может принимать необязательные аргументы. Необязательные аргументы должны быть непосредственно присоединены к параметру, к которому они относятся.
Это означает, что аргумент будет использован только для параметра, если вы используете его так:
cmd --flag=value # or cmd -fvalue
но не так:
cmd --flag value # "value" here will be used as a positional argument # and "--flag" won't have an argument.
Если бы это не было так, использование параметра без необязательного аргумента было бы затруднительным, если вы также хотели использовать позиционные аргументы.
Например:
grep --color auto # Here "auto" will be used as the search string, # "color" will not have an argument and will fall back to the default, # which also *happens to be* auto. grep --color always # Here grep will still only use color "auto"matically # and search for the string "always".
Это не специфично для argparse, но общее для всех вещей, использующих getopt(3) (если они вообще имеют необязательные аргументы). Этот grep пример — то, как на самом деле ведёт себя GNU grep.
Проверка значений флага
Иногда вам нужно проверить значения параметров. Например, что это действительное целое число в определённом диапазоне или IP-адрес, или что-то совершенно другое. Вы всегда можете сделать это после того, как argparse вернётся, но вы также можете потребовать, чтобы argparse выполнил проверку, выполнив произвольный скрипт fish. Для этого просто добавьте ! (восклицательный знак), а затем скрипт fish, который нужно выполнить. При выполнении этого кода будут определены три переменные:
-
_argparse_cmdбудет установлена в значение значенияargparse --nameзначения. -
_flag_nameбудет установлено на короткий или длинный флаг, который обрабатывается. -
_flag_valueбудет установлена в значение, связанное с обрабатываемым флагом.
Эти переменные передаются функции в качестве локальных экспортированных переменных.
Скрипт должен выводить любые сообщения об ошибках в stdout, а не stderr. Он должен возвращать статус ноль, если значение флага является допустимым, в противном случае — ненулевой статус, чтобы указать, что оно недействительно.
Fish поставляется с функцией _validate_int, которая принимает --min и --max флаги. Допустим, ваша команда принимает -m или --max флаги, а минимальное допустимое значение — ноль, а максимальное — 5. Вы бы определили параметр следующим образом: m/max=!_validate_int --min 0 --max 5. По умолчанию, если вы просто вызываете _validate_int без этих флагов, проверяется, является ли значение допустимым целым числом без ограничений на минимальное или максимальное разрешённое значение.
Примеры OPTION_SPEC
Некоторые примеры OPTION_SPEC:
-
h/helpозначает, что оба-hи--helpявляются допустимыми. Флаг — булев, и его можно использовать более одного раза. Если используется любой из флагов, то_flag_hи_flag_helpбудут установлены в соответствии с тем, как был увиден любой из флагов, столько раз, сколько он был увиден. Таким образом, он может быть установлен в-h,-hи--help, аcount $_flag_hдаст «3». -
helpозначает, что допустим только--help. Флаг — булев, и его можно использовать более одного раза. Если он используется, то_flag_helpбудет установлен как указано выше. Такжеh-help(с произвольной короткой буквой) для обратной совместимости. -
longonly=— это флаг--longonly, который требует опцию; нет короткого флага или даже переменной короткого флага. -
n/name=означает, что оба-nи--nameявляются допустимыми. Он требует значения и может быть использован не более одного раза. Если флаг виден, то_flag_nи_flag_nameбудут установлены со единственным обязательным значением, связанным с флагом. -
n/name=?означает, что оба-nи--nameявляются допустимыми. Он принимает необязательное значение и может быть использован не более одного раза. Если флаг виден, то_flag_nи_flag_nameбудут установлены со значением, связанным с флагом, если оно было указано; в противном случае они будут установлены без значений. -
name=+означает, что допустим только--name. Он требует значения и может быть использован более одного раза. Если флаг виден, то_flag_nameбудет установлен со значениями, связанными с каждым случаем. -
xозначает, что допустим только-x. Это булев флаг, который можно использовать более одного раза. Если он виден, то_flag_xбудет установлен как выше. -
x=,x=?, иx=+аналогичны примерам n/name выше, но нет альтернативы длинного флага для короткого флага-x. -
#max(или#-max) означает, что флаги, соответствующие регулярному выражению «^--?\d+$», являются допустимыми. При их обнаружении они присваиваются переменной_flag_max. Это позволяет указывать любое допустимое целое положительное или отрицательное число, предваряя его одиночным знаком «-». Многие команды поддерживают этот идиоматический способ. Например,head -3 /a/fileдля вывода только первых трёх строк из /a/file. -
n#maxозначает, что флаги, соответствующие регулярному выражению «^--?\d+$», являются допустимыми. При их обнаружении они присваиваются переменным_flag_nи_flag_max. Это позволяет указывать любое допустимое целое положительное или отрицательное число, предваряя его одиночным знаком «-». Многие команды поддерживают этот идиоматический способ. Например,head -3 /a/fileдля вывода только первых трёх строк из /a/file. Вы также можете указать значение, используя любой из флагов:-n NNNили--max NNNв этом примере. -
#longonlyприводит к тому, что последнее целое числовое значение опции сохраняется в_flag_longonly.
После обработки аргументов переменная argv устанавливается со значением в локальной области видимости для любых значений, которые ещё не были израсходованы во время обработки флагов. Если несвязанных значений нет, то переменная устанавливается, но count $argv будет нулём.
Если при обработке argparse произойдет ошибка, то программа завершится с ненулевым кодом возврата и выведет сообщения об ошибке в стандартный поток ошибок.
Ограничения
Одним из ограничений --ignore-unknown является то, что если неизвестная опция задана в группе с известными опциями, вся группа будет сохранена в $argv. argparse не будет производить здесь никаких перестановок.
Например:
argparse --ignore-unknown h -- -ho echo $_flag_h # is -h, because -h was given echo $argv # is still -ho
Это ограничение может быть снято в будущем.
Кроме того, он может анализировать только известные опции до первой неизвестной опции в группе — неизвестная опция может принимать опции, поэтому неясно, что означает любой символ после неизвестной опции.
© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.6/cmds/argparse.html