使用 Lua 解析参数

参数对于交互式计算至关重要,Lua 编程语言提供了 {…​} 表达式来封装在启动 Lua 脚本时给出的可变参数。
尚无读者喜欢这篇文章。
women programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

大多数计算机命令由两部分组成:命令和参数。命令是要执行的程序,而参数可能是命令选项或用户输入。如果没有这种结构,用户将不得不编辑命令的代码,仅仅为了更改命令处理的数据。想象一下重写 printf 命令,仅仅为了让你的计算机用“hello world”消息来问候你。参数对于交互式计算至关重要,Lua 编程语言提供了 {…​} 表达式来封装在启动 Lua 脚本时给出的可变参数。

在 Lua 中使用参数

几乎每个给计算机的命令都假定有一个参数,即使它期望参数是一个空列表。Lua 记录了在它启动后写入的内容,即使你可能对这些参数不做任何操作。要在 Lua 启动时使用用户提供的参数,请遍历 {…​}

local args = {...}

for i,v in ipairs(args) do
    print(v)
end

运行代码

$ lua ./myargs.lua
$ lua ./myargs.lua foo --bar baz
foo
--bar
baz
----

没有参数是安全的,Lua 会按原样打印所有参数。

解析参数

对于简单的命令,基本的 Lua 功能足以解析和处理参数。这是一个简单的例子

-- setup

local args = {...}

-- engine

function echo(p)
   print(p)
end

-- go

for i,v in ipairs(args) do
  print(i .. ": " .. v)
end

for i,v in ipairs(args) do
  if args[i] == "--say" then
    echo("echo: " .. args[i+1])
  end
end

setup 部分,将所有命令参数转储到一个名为 args 的变量中。

engine 部分,创建一个名为 echo 的函数,它会打印你“喂给”它的任何内容。

最后,在 go 部分,解析 args 变量(用户在启动时提供的参数)中的索引和值。在这个示例代码中,第一个 for 循环只是为了清晰起见打印每个索引和值。

第二个 for 循环使用索引来检查第一个参数,它被假定为一个选项。在这个示例代码中,唯一有效的选项是 --say。如果循环找到字符串 --say,它会调用 echo 函数,并将当前参数的索引加 1下一个参数)作为函数参数提供。

命令参数的分隔符是一个或多个空格。运行代码以查看结果

$ lua ./echo.lua --say zombie apocalypse
1: --say
2: zombie
3: apocalypse
echo: zombie

大多数用户了解到,在向计算机发出命令时,空格是很重要的,因此在这种情况下,删除第三个参数是预期的行为。这是一个演示两种有效“转义”方法的变体

$ lua ./echo.lua --say "zombie apocalypse"
1: --say
2: zombie apocalypse
echo: zombie apocalypse

$ lua ./echo.lua --say zombie\ apocalypse
1: --say
2: zombie apocalypse
echo: zombie apocalypse

解析参数

手动解析参数很简单且无需依赖项。但是,有一些细节你必须考虑。大多数现代命令允许短选项(例如,-f)和长选项(--foo),并且大多数提供带有 -h--help 的帮助菜单,或者在未提供必需的参数时提供帮助菜单。

使用 LuaRocks 可以轻松安装额外的库。有一些非常好的库,例如 alt-getopt,它们为解析参数提供了额外的基础设施。

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

评论已关闭。

© . All rights reserved.