TranslateProject/published/202212/20221129.3 ⭐️⭐️ Parse arguments with Lua.md
2023-01-01 10:31:56 +08:00

127 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[#]: subject: "Parse arguments with Lua"
[#]: via: "https://opensource.com/article/22/11/lua-command-arguments"
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
[#]: collector: "lkxed"
[#]: translator: "geekpi"
[#]: reviewer: "wxy"
[#]: publisher: "wxy"
[#]: url: "https://linux.cn/article-15321-1.html"
用 Lua 解析参数
======
![][0]
> 参数对于交互式计算至关重要Lua 编程语言提供了 `{...}` 表达式来封装在启动 Lua 脚本时给定的可变参数。
大多数计算机命令由两部分组成:命令和参数。命令是要执行的程序,而参数可能是命令选项或用户输入。如果没有这种结构,用户将不得不编辑命令的代码,以改变命令所处理的数据。想象一下重写 [printf][1] 命令只是为了让你的计算机用 “hello world” 消息问候你。参数对于交互式计算至关重要,[Lua 编程语言][2] 提供了 `{...}` 表达式来封装在启动 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][3] 可以轻松安装其他库。有一些非常好的工具,例如 [alt-getopt][4],它们为解析参数提供了额外的基础设施。
--------------------------------------------------------------------------------
via: https://opensource.com/article/22/11/lua-command-arguments
作者:[Seth Kenlon][a]
选题:[lkxed][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/seth
[b]: https://github.com/lkxed
[1]: https://opensource.com/article/20/8/printf
[2]: https://opensource.com/article/22/11/lua-worth-learning
[3]: https://opensource.com/article/19/11/getting-started-luarocks
[4]: https://opensource.com/article/21/8/parsing-commands-lua
[0]: https://img.linux.net.cn/data/attachment/album/202212/06/111552sofsllzdfffgfakh.jpg