用 Lua 解析参数
创始人
2024-03-02 13:31:01
0

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

大多数计算机命令由两部分组成:命令和参数。命令是要执行的程序,而参数可能是命令选项或用户输入。如果没有这种结构,用户将不得不编辑命令的代码,以改变命令所处理的数据。想象一下重写 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,它们为解析参数提供了额外的基础设施。


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

作者:Seth Kenlon 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

美团宣布开源LongCat...
钛媒体App 12月8日消息,美团LongCat团队正式发布并开源...
2025-12-09 09:45:32
智谱GLM-4.6V系列多...
IT之家 12 月 8 日消息,智谱 AI 今日官宣发布并开源 G...
2025-12-08 20:15:56
研究团队新发现:AI大模型...
新华社记者 魏梦佳 近年来,AI的发展遵循着一个简单直接的规则——...
2025-11-23 10:46:03
蚂蚁开源万亿参数高性能强化...
据“百灵大模型”公众号消息,蚂蚁集团宣布开源万亿参数高性能强化学习...
2025-11-20 10:16:02
微博AI推出开源模型Vib...
【CNMO科技消息】近日,微博AI推出了开源大型语言模型(LLM)...
2025-11-13 11:45:12
MTEB 多语言榜单全球第...
IT之家 11 月 12 日消息,腾讯开源官方公众号今日宣布:来自...
2025-11-12 16:15:44

热门资讯

《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
硬核观察 #1245 Open... #1 OpenAI 悄然删除禁止将 ChatGPT 用于 “军事和战争” 的禁令在 1 月 10 日...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
如何理解Apache 2.0许... 提要:Apache 2.0许可证中的专利许可条款使得开源代码可以安全使用,但它经常被误解。Apach...