如何在lua中使用系统命令

时间:2016-07-14 10:00:23

标签: ubuntu lua lua-table

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

在命令行中运行时

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次。最后一次迭代是重新计算零值。

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)")                            

请帮我解决我的问题。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

正如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)" )

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