2016-07-14 21 views
0

Ich habe versucht, die Werte durch Ausführen der Befehle "ip -4 route show" zu drucken. Actually running per Befehl gibt es 3 Werte. Während der Programmierung wird die Iteration jedoch zwei Mal ausgeführt. für die dritte Iteration, die null zurückgibt.So verwenden Sie Systembefehle in lua

während in der Kommandozeile ausgeführt wird: nur

[email protected]:/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 

Bei dem Versuch, durch Programm wird die Iteration für 2 mal arbeiten. Die letzte Iteration gibt null zurück.

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

bitte helfen Sie mir, mein Problem zu lösen.

Antwort

0

Weil die letzte Zeile nicht mit dem Muster übereinstimmt.

0

Wie FareakyGnome sagt, sucht Ihr Muster nach einer Zeile mit 9 Nicht-Leerzeichen "Wörtern", aber die letzte Zeile in Ihrer Ausgabe hat nur 5 Nicht-Leerzeichen-Wörter. Das Muster stimmt nicht überein, daher gibt line:match(...) den Wert nil zurück, und alle drei zugewiesenen Variablen werden mit nil belegt.

Sie müssen wahrscheinlich ändern, wie Sie die Zeilen übereinstimmen möchten, damit dies funktioniert. Vielleicht in einem Spiel versuchen, für die ersten beiden Variablen passenden und dem dritten in einem separaten Spiel:

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

Dann sollten die ersten beiden Variablen gefüllt werden, und die dritte gefüllt werden, wenn es genügend nicht-Raum Worte sind, oder sonst bleibt null, was darauf hinweist, dass dieses Feld in der Ausgabe nicht verfügbar war.