mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-29 21:41:00 +08:00
Merge pull request #28084 from lkxed/20221129-3-Parse-arguments-with-Lua
[手动选题][tech]: 20221129.3 ⭐️⭐️ Parse arguments with Lua.md
This commit is contained in:
commit
7c22d953b7
122
sources/tech/20221129.3 ⭐️⭐️ Parse arguments with Lua.md
Normal file
122
sources/tech/20221129.3 ⭐️⭐️ Parse arguments with Lua.md
Normal file
@ -0,0 +1,122 @@
|
||||
[#]: 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: " "
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
Parse arguments with Lua
|
||||
======
|
||||
|
||||
Most computer commands consist of two parts: The command and arguments. The command is the program meant to be executed, while the arguments might be command options or user input. Without this structure, a user would have to edit the command's code just to change the data that the command processes. Imagine rewriting the [printf][1] command just to get your computer to greet you with a "hello world" message. Arguments are vital to interactive computing, and the [Lua programming language][2] provides the `{…}` expression to encapsulate varargs given at the time of launching a Lua script.
|
||||
|
||||
### Use arguments in Lua
|
||||
|
||||
Almost every command given to a computer assumes an argument, even if it expects the argument to be an empty list. Lua records what's written after it launches, even though you may do nothing with those arguments. To use arguments provided by the user when Lua starts, iterate over the `{…}` table:
|
||||
|
||||
```
|
||||
local args = {...}
|
||||
|
||||
for i,v in ipairs(args) do
|
||||
print(v)
|
||||
end
|
||||
```
|
||||
|
||||
Run the code:
|
||||
|
||||
```
|
||||
$ lua ./myargs.lua
|
||||
$ lua ./myargs.lua foo --bar baz
|
||||
foo
|
||||
--bar
|
||||
baz
|
||||
----
|
||||
```
|
||||
|
||||
Having no arguments is safe, and Lua prints all arguments exactly as entered.
|
||||
|
||||
### Parse arguments
|
||||
|
||||
For simple commands, the basic Lua faculties are sufficient to parse and process arguments. Here's a simple example:
|
||||
|
||||
```
|
||||
-- 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
|
||||
```
|
||||
|
||||
In the `setup` section, dump all command arguments into a variable called `args`.
|
||||
|
||||
In the `engine` section, create a function called `echo` that prints whatever you "feed" into it.
|
||||
|
||||
Finally, in the `go` section, parse the index and values in the `args` variable (the arguments provided by the user at launch). In this sample code, the first `for` loop just prints each index and value for clarity.
|
||||
|
||||
The second `for` loop uses the index to examine the first argument, which is assumed to be an option. The only valid option in this sample code is `--say`. If the loop finds the string `--say`, it calls the `echo` function, and the index of the current argument _plus 1_ (the _next_ argument) is provided as the function parameter.
|
||||
|
||||
The delimiter for command arguments is one or more empty spaces. Run the code to see the result:
|
||||
|
||||
```
|
||||
$ lua ./echo.lua --say zombie apocalypse
|
||||
1: --say
|
||||
2: zombie
|
||||
3: apocalypse
|
||||
echo: zombie
|
||||
```
|
||||
|
||||
Most users learn that spaces are significant when giving commands to a computer, so dropping the third argument, in this case, is expected behavior. Here's a variation to demonstrate two valid "escape" methods:
|
||||
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
|
||||
### Parse arguments
|
||||
|
||||
Parsing arguments manually is simple and dependency-free. However, there are details you must consider. Most modern commands allow for short options (for instance, `-f`) and long options (`--foo`), and most offer a help menu with `-h` or `--help` or when a required argument isn't supplied.
|
||||
|
||||
Using [LuaRocks][3] makes it easy to install additional libraries. There are some very good ones, such as [alt-getopt][4], that provide additional infrastructure for parsing arguments.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/11/lua-command-arguments
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [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
|
Loading…
Reference in New Issue
Block a user