2012-06-15 7 views
6

Wenn ich will, DEF_23 entsprechen den folgenden regulären Ausdruck verwenden:

expect { 
    -re "DEF_\[0-9]*" 
    set result $expect_out(1,string) 
} 

warum sagt es kein solches Element in Array? Wie funktioniert dieses $ expect_out? und wenn ich das Ergebnis als DEF zuweisen möchte, wie bekomme ich das DEF mit regexp und ordne es dem Ergebnis der Variablen zu?

+1

Meinst du extra Klammern um die "Set" Linie zu haben? Sonst ist es eine sehr seltsame Verwendung von "erwarten" in der Tat ... –

Antwort

9

Sie suchen nach expect_out(0,string) - das Array-Element 1,string würde ausgefüllt werden, wenn Sie Klammern in Ihrem regulären Ausdruck erfassen würden.

Die expect manpage dokumentiert die Verwendung von expect_out in der Dokumentation des Befehl erwarten:

Nach ein Muster (oder EOF oder full_buffer), jede passende und bisher unerreichte Leistung in der gespeichert wird passend Variable expect_out (Puffer). In den Variablen werden bis zu 9 Regexp-Teilstring-Übereinstimmungen gespeichert. Expect_out (1, string) bis expect_out (9, string). Wenn die -indices Flagge vor einem Muster verwendet wird, die Start- und End-Indizes (in einer geeigneten Form für lrange) die 10-Strings in den Variablen expect_out gespeichert sind (X, Start) und expect_out (X , Ende) wobei X eine Ziffer ist, entspricht der Position der Teilzeichenfolge im Puffer. 0 bezieht sich auf Strings, die mit dem gesamten Muster übereinstimmen und sowohl für Glob-Patterns als auch für Regexp-Patterns generiert werden.

Es gibt ein illustratives Beispiel in der Hilfeseite.

1

Es scheint, dass die obige Erklärung nicht präzise ist! Überprüfen Sie folgendes Beispiel:

$ cat test.exp 
#!/usr/bin/expect 

set timeout 5 
log_user 0 

spawn bash 

send "ls -1 db*\r" 
expect { 
    -re "^db.*$" { 
    set bkpfile $expect_out(0,string) 
    } 
} 

send_user "The filename is: $bkpfile\n" 

close 
$ ls -1 db* 
dbupgrade.log 
$ ./test.exp 
can't read "bkpfile": no such variable 
    while executing 
"send_user "The filename is: $bkpfile\n"" 
    (file "./test.exp" line 15) 
$ 

Das Testergebnis ist das gleiche, wenn $ expect_out (1, string) oder $ expect_out (Puffer) verwendet wird. Fehle ich etwas oder das ist das erwartete Verhalten?

0

Aleksandar - es sollte funktionieren, wenn Sie die Übereinstimmung zu "\ ndb. * $" Ändern.

Wenn Sie auf exp_internal 1 einschalten, werden Sie den Puffer sehen enthält etwa so: "ls -1 db * \ r \ ndbupgrade.log \ r \ n08: 46: 09"

Also, die caret (^) wird dein Muster-Match abwerfen.