用 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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive