如何在lua中使用系统命令

我尝试通过运行命令 "ip -4 route show" 打印值。 实际上,通过命令运行它会给出3个值。但是在编程时,迭代仅运行前2次。第3次迭代返回nil。

在命令行运行时:

root@start:/usr/lib/lua/transformer/mapper# ip -4 route show
169.254.1.0/24 dev vlan_lte_mgmt  proto kernel  scope link  src 169.254.1.1
192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.1
239.0.0.0/8 dev br-lan  scope link

在尝试通过程序运行时,迭代仅适用于2次。最后一次迭代返回nil值。

function M.loadRoutes(onlyDefault)
  local routes = {}
  local defaultRoute
  local i, t, popen = 0, {}, io.popen
  local fd = popen("ip -4 route show")
  if fd then
    for line in fd:lines() do
        local fields = {}
        fields.destip,fields.ifname,fields.gateway = line:match("(%S+)%s+%S+%s+(%S+)%s+%S+%s+%S+%s+%S+%s+%S+%s+%S+%s+(%S)")

请帮助我解决我的问题。

点赞
用户6544989
用户6544989

因为最后一行与模式不匹配。

2016-07-14 16:34:03
用户301729
用户301729

正如FareakyGnome所说,您的模式是在搜索一行有9个非空格的“单词”,但是输出中的最后一行只有5个非空格的“单词”。模式不匹配,因此line:match(...)返回nil,且所有被分配的三个变量都将被分配nil。

您可能需要改变如何匹配行,以使其起作用。也许尝试在一个匹配中匹配前两个变量,然后在分别匹配第三个变量:

fields.destip,fields.ifname = line:match(”(%S +)%s +%S +%s +(%S +)“)
fields.gateway = line:match(”%S +%s +%S +%s +%S +%s +%S +%s +%S +%s +%S +%s +%S +%s +%S +%s +(%S)“)

然后前两个变量应该被填充,如果有足够的非空格“单词”,第三个将被填充,否则将保持nil,表示该字段在输出中不可用。

2016-07-16 03:46:25