Linux中國

用 Lua 解析參數

參數對於互動式計算至關重要,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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國