这是一个用于编写接受选项和/或参数的 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
函数,并通过将 shell 脚本添加到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可以使用 Bash 的完成 API 处理脚本的自动完成。要激活命令的自动完成功能,请运行以下命令:
eval $( my-command.sh _register_completion )
如果该点的单词以-
开头,制表符补全将建议定义的选项,否则建议子命令和参数。
要告诉bash-args建议将什么作为参数,您可以在脚本(或子命令)的Argument
数据中或在选项的argument
参数中指定参数类型。
以下是内置参数类型:
要创建新的参数类型并将其设置为自动完成,请定义一个名为_complete_my_arg_type
的函数。该函数必须可供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
}