我尝试通过运行命令" 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)")
请帮我解决我的问题。
答案 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)" )
然后前两个变量应该被填充,如果有足够的非空格词,则填充第三个变量,否则保持为零,表示该字段在输出中不可用。