在 Lua 中解析命令行选项

我最喜欢的解决 Lua 中解析问题的方法是 alt-getopt。
33 位读者喜欢这篇文章。
Woman sitting in front of her laptop

kris krüg

当你在终端输入命令时,通常会有 选项,也称为开关 或 标志,你可以使用它们来修改命令的运行方式。这是 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 函数来提取选项的值。

要创建一个不接受自身参数但可以是 onoff (通常称为开关)的选项,请将要定义的短选项放在冒号 (:) 字符的右侧。

在本示例中,我创建了一个循环来检查短选项 -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 之外,还有其他库,但我发现这个库易于使用且快速。

接下来阅读
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

1 条评论

太棒了!我喜欢 Lua!

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.