Это основа для написания bash-скриптов, принимающих параметры и/или аргументы. Определите параметры и аргументы, принимаемые вашим скриптом, используя простой декларативный синтаксис, и позвольте bash-args :
Он спроектирован так, чтобы быть простым в использовании, не мешать и обеспечивать безупречный пользовательский опыт.
Он стремится быть переносимым, набор тестов подходит для всех основных версий bash >= 3.2.
Чтобы использовать bash-args в своих сценариях, просто создайте файл init.sh
Вот пример сценария eval-command.sh
:
#! /usr/bin/env bash
# Summary : My first bash script using bash-args.
#
# Description : This takes a command as argument, and runs it.
#
# Argument : command
#
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
. path/to/bash-args/init.sh
# After sourcing the script, you can use the $directory and the $dry_run
# variables to get the values of the options typed (or not) in the command line.
# The other arguments are available as standard bash arguments $1, $2, etc.
command= " cd $directory && $1 "
if [[ $dry_run -eq 1 ]] ; then
echo " $command "
else
eval " $command "
fi
Давайте попробуем запустить эту команду с опциями:
$ eval-command.sh --dry-run --directory /home 'echo hello'
cd /home && echo hello
Вы можете использовать короткие варианты, и их можно сгруппировать:
$ eval-command.sh -nd /home 'echo hello'
cd /home && echo hello
Заполнение вкладки «Настройка» простой командой:
$ eval $(eval-command.sh _register_completion)
Предусмотрена страница помощи:
$ eval-command.sh --help
My first bash script using bash-args.
Usage : eval-command.sh [OPTIONS] [COMMAND]
This takes a command as argument, and runs it.
Options :
--help | -h
Show this help.
--dry-run | -n
Don't execute, just print.
--directory | -d [DIRECTORY]
The directory in which to run the command.
Bash-args также может управлять подкомандами:
main-script.sh help subcmd1
или main-script.sh subcmd1 --help
. Чтобы это произошло, вызовите функцию cmd_run
в конце вашего основного сценария и определите подкоманды, добавив сценарии оболочки в каталог cmd/
. Структура вашего проекта должна выглядеть так:
main-script.sh
cmd/
- subcmd1.sh
- subcmd2.sh
Чтобы задокументировать подкоманды и определить их параметры и аргументы, напишите метаданные в первых блоках комментариев каждой подкоманды, как и в основном скрипте.
Параметры, определенные в основном сценарии, доступны для всех подкоманд, тогда как параметры, определенные в подкоманде, доступны только для этой конкретной подкоманды.
Метаданные скрипта имеют очень простой синтаксис: в первом блоке комментариев каждая строка, начинающаяся со слова, за которым следует точка с запятой, определяет новое поле, а все, что следует за точкой с запятой, определяет его значение. Следующие строки до начала следующего поля добавляются к значению.
Вот поля, используемые bash-args .
--version
, которая печатает его имя и версию.Параметры определены в метаданных параметров , как в примере сценария:
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
Опция начинается с %
за которым следует ее имя. Имена опций должны содержать только буквенно-цифровые символы _
или -
.
Следующие строки определяют параметры опции. Когда скрипт запускается, это фактически оценивается как код bash. Определенные переменные являются параметрами опции. Это означает, что применяются общие правила заключения в кавычки для строк и что вы можете определять параметры динамически, как в примере выше, в котором параметру параметра directory
default
присвоено значение $(pwd)
.
Опция должна определять как минимум type
и variable
параметр:
type
может быть flag
или option
. Флаги не принимают аргументы, в отличие от опций.variable
— это имя переменной, под которой значение аргумента опции будет доступно в вашем скрипте.Опция может определять следующие параметры:
desc
— описание опции, используемой на страницах справки.short
— это одна буква, используемая для короткого варианта.argument
— тип аргумента. см. типы аргументовdefault
— это значение, которое принимает опция, если опция не указана в команде, введенной пользователем.value
— это значение, которое принимает опция, когда опция указана , но без аргумента. Переменные, определенные параметрами, гарантированно будут определены в вашем скрипте: если bash-args не сможет найти значение для параметра, он завершится с ошибкой. Это означает, что если вы не укажете значение параметра default
, запуск основного сценария без этого параметра приведет к ошибке.
Другими словами, если вы не хотите, чтобы опция была обязательной, определите в ее определении параметр default
.
Параметр value
работает аналогичным образом. Если вы не укажете его, при использовании параметра потребуется аргумент. Если да, то эту опцию можно использовать без аргументов.
Параметры флага работают одинаково, и, поскольку они не принимают аргументов, вы должны определить их параметры default
и value
.
Bash-args может обрабатывать автозаполнение вашего скрипта, используя API завершения Bash. Чтобы активировать автозаполнение вашей команды, выполните следующую команду:
eval $( my-command.sh _register_completion )
Затем табуляция предложит определенные параметры, если слово в точке начинается с -
, и предложит подкоманды и аргументы в противном случае.
Чтобы сообщить bash-args, что предлагать в качестве аргумента, вы указываете тип аргумента в метаданных Argument
вашего скрипта (или подкоманды) или в параметре argument
опции.
Вот встроенные типы аргументов:
Чтобы создать новый тип аргумента и настроить его для автозаполнения, определите функцию с именем _complete_my_arg_type
. Эта функция должна быть доступна сценарию init.sh
, поэтому ее необходимо определить до . init.sh
строка . init.sh
Предполагается, что функции завершения добавляют свои предложения в глобальный массив COMP_REPLIES
. Для удобства они получают текущее слово в качестве параметра, но вы также можете использовать глобальные переменные COMP_LINE
и COMP_POINT
, как и во всех скриптах завершения bash.
Вот как определяется тип аргумента файла :
_complete_file () {
# $1 is the word being typed that we want to complete.
for file in " ${1-} " * ; do
# add each file to the completion candidates.
COMP_REPLIES+=( " $file " )
done
}