用 Lua 解析参数
参数对于交互式计算至关重要，Lua 编程语言提供了 {...} 表达式来封装在启动 Lua 脚本时给定的可变参数。
Lua 参数
参数对于交互式计算至关重要，Lua 编程语言提供了 {...} 表达式来封装在启动 Lua 脚本时给定的可变参数。
![](/data/attachment/album/202212/06/111552sofsllzdfffgfakh.jpg)



> 
> 参数对于交互式计算至关重要，Lua 编程语言提供了 `{...}` 表达式来封装在启动 Lua 脚本时给定的可变参数。
> 
> 
> 


大多数计算机命令由两部分组成：命令和参数。命令是要执行的程序，而参数可能是命令选项或用户输入。如果没有这种结构，用户将不得不编辑命令的代码，以改变命令所处理的数据。想象一下重写 [printf](https://opensource.com/article/20/8/printf) 命令只是为了让你的计算机用 “hello world” 消息问候你。参数对于交互式计算至关重要，[Lua 编程语言](https://opensource.com/article/22/11/lua-worth-learning) 提供了 `{...}` 表达式来封装在启动 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](https://opensource.com/article/19/11/getting-started-luarocks) 可以轻松安装其他库。有一些非常好的工具，例如 [alt-getopt](https://opensource.com/article/21/8/parsing-commands-lua)，它们为解析参数提供了额外的基础设施。




---


via: <https://opensource.com/article/22/11/lua-command-arguments>


作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

