当你在终端输入命令时,通常会有 选项,也称为开关 或 标志,你可以使用它们来修改命令的运行方式。这是 POSIX 规范 定义的有用约定,因此作为程序员,了解如何检测和解析选项很有帮助。
与大多数语言一样,在 Lua 中有几种方法可以解决解析选项的问题。我最喜欢的是 alt-getopt。
安装
在你的代码中获取和使用 alt-getopt 最简单的方法是 使用 LuaRocks 安装它。对于大多数用例,你可能希望将其安装到本地项目目录中
$ mkdir local
$ luarocks --tree=local install alt-getopt
Installing https://luarocks.org/alt-getopt-0.X.Y-1.src.rock
[...]
alt-getopt 0.X.Y-1 is now installed in /tux/myproject/local (license: MIT/X11)
或者,你可以从 GitHub 下载代码。
向你的 Lua 代码添加库
假设你已在本地安装了该库,那么你可以定义你的 Lua 包路径,然后 require
alt-getopt 包
package.path = package.path .. ';local/share/lua/5.1/?.lua'
local alt_getopt = require("alt_getopt")
如果你已将其安装到已知的系统位置,则可以省略 package.path
行(因为 Lua 已经知道查找系统范围的库。)
现在你可以开始在 Lua 中解析选项了。
在 Lua 中解析选项
解析选项首先要做的是定义你的应用程序可以接受的有效选项。alt_getopt 库主要将所有选项视为短选项,这意味着你将选项定义为单个字母。你可以稍后添加长版本。
当你定义有效选项时,你将创建一个由冒号 (:
) 分隔的列表,该列表由 alt-getopts 提供的 get_opts
函数解释。
首先,创建一些变量来表示选项。变量 short_opt
和 optarg
分别表示短选项和选项参数。这些是任意变量名,因此你可以将它们命名为任何名称(只要它是变量的有效名称)。
表 long_opts
必须存在,但我发现最好在确定短选项后定义长选项的值,所以现在将其留空。
local long_opts = {}
local short_opt
local optarg
声明这些变量后,你可以遍历用户提供的参数,检查是否有任何参数与你批准的有效短选项列表匹配。
如果找到有效的选项,则可以使用 Lua 中的 pairs
函数来提取选项的值。
要创建一个不接受自身参数但可以是 on 或 off (通常称为开关)的选项,请将要定义的短选项放在冒号 (:
) 字符的右侧。
在本示例中,我创建了一个循环来检查短选项 -a
,它是一个开关
short_opt,optarg = alt_getopt.get_opts (arg, ":a", long_opts)
local optvalues = {}
for k,v in pairs (short_opt) do
table.insert (optvalues, "value of " .. k .. " is " .. v .. "\n")
end
table.sort (optvalues)
io.write (table.concat (optvalues))
for i = optarg,#arg do
io.write (string.format ("ARGV [%s] = %s\n", i, arg [i]))
end
在本示例代码的末尾,我包含了一个 for 循环来迭代命令中任何剩余的参数,因为任何未检测为有效选项的内容都必须是参数(可能是文件名、URI 或你的应用程序操作的任何内容)。
测试代码
$ lua test.lua -a
value of a is 1
测试脚本已成功检测到选项 -a
,并为其分配了值 1 以表示它确实存在。
再次尝试使用额外的参数
$ lua test.lua -a hello
value of a is 1
ARGV [2] = hello
带参数的选项
某些选项需要自己的参数。例如,你可能希望允许用户将你的应用程序指向自定义配置文件,将属性设置为颜色,或设置图形的分辨率。在 alt_getopt 中,接受参数的选项放在短选项列表中冒号 (:
) 的左侧。
short_opt,optarg = alt_getopt.get_opts (arg, "c:a", long_opts)
测试代码
$ lua test.lua -a -c my.config
value of a is 1
value of c is my.config
再次尝试,这次使用备用参数
$ lua test.lua -a -c my.config hello
value of a is 1
value of c is my.config
ARGV [4] = hello
长选项
短选项非常适合高级用户,但它们往往不太容易记住。你可以创建一个指向短选项的长选项表,以便用户可以在用单字母选项缩写命令之前学习长选项。
local long_opts = {
alpha = "a",
config = "c"
}
用户现在可以在长选项和短选项之间进行选择
$ lua test.lua --config my.config --alpha hello
value of a is 1
value of c is my.config
ARGV [4] = hello
选项解析
这是完整的演示代码,供你参考
#!/usr/bin/env lua
package.path = package.path .. ';local/share/lua/5.1/?.lua'
local alt_getopt = require("alt_getopt")
local long_opts = {
alpha = "a",
config = "c"
}
local short_opt
local optarg
short_opt,optarg = alt_getopt.get_opts (arg, "c:a", long_opts)
local optvalues = {}
for k,v in pairs (short_opt) do
table.insert (optvalues, "value of " .. k .. " is " .. v .. "\n")
end
table.sort (optvalues)
io.write (table.concat (optvalues))
for i = optarg,#arg do
io.write (string.format ("ARGV [%s] = %s\n", i, arg [i]))
end
在该项目的 Git 仓库中还有更多示例。为用户提供选项是任何应用程序的重要功能,而 Lua 使其易于实现。除了 alt_getopt 之外,还有其他库,但我发现这个库易于使用且快速。
1 条评论