argparse - разбор опций, переданных в скрипт или функцию Fish
Синопсис
argparse [OPTIONS] OPTION_SPEC... -- [ARG...]
Описание
Эта команда упрощает обработку аргументов в скриптах и функциях Fish, подобно тому, как это делают встроенные команды Fish. Вы передаёте аргументы, определяющие известные опции, за которыми следует буквальный --, а затем аргументы для разбора (которые могут также включать буквальный --). argparse затем устанавливает переменные, указывающие переданные опции со значениями, и устанавливает $argv (и всегда $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должны следовать за списком короткой или длинной опций, которые взаимоисключают друг друга. Вы можете использовать это несколько раз для определения нескольких наборов взаимоисключающих опций. -
-Nили--min-argsза которым следует целое число, определяет минимальное количество допустимых аргументов, не являющихся опциями. По умолчанию ноль. -
-Xили--max-argsза которым следует целое число, определяет максимальное количество допустимых аргументов, не являющихся опциями. По умолчанию бесконечность. -
-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 argparse 'h/help' 'n/name' -- $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будут установлены в счёт того, сколько раз был замечен любой из флагов. -
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 произошла ошибка, то выполнение программы завершится с ненулевым кодом состояния и будет выведено сообщение об ошибке на стандартный поток ошибок.
© 2021 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.3/cmds/argparse.html