How can I assign a variable using $expect_out in TCL/EXPECT?

后端 未结 3 816
[愿得一人]
[愿得一人] 2021-02-09 02:14

If I want to match DEF_23 using the following regexp:

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

why

相关标签:
3条回答
  • 2021-02-09 02:55

    It seems that the above explication is not precise! Check this example:

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

    The test result is the same when $expect_out(1,string) or $expect_out(buffer)is used. Am I missing something or this is the expected behavior?

    0 讨论(0)
  • 2021-02-09 02:57

    Aleksandar - it should work if you change the match to "\ndb.*$".

    If you turn on exp_internal 1, you will see the buffer contains something like this: "ls -1 db*\r\ndbupgrade.log\r\n08:46:09"

    So, the caret (^) will throw your pattern match off.

    0 讨论(0)
  • 2021-02-09 03:10

    You're looking for expect_out(0,string) -- the array element 1,string would be populated if you had capturing parentheses in your regular expression.

    The expect manpage documents the use of expect_out in the documentation of the expect command:

    Upon matching a pattern (or eof or full_buffer), any matching and previously unmatched output is saved in the variable expect_out(buffer). Up to 9 regexp substring matches are saved in the variables expect_out(1,string) through expect_out(9,string). If the -indices flag is used before a pattern, the starting and ending indices (in a form suitable for lrange) of the 10 strings are stored in the variables expect_out(X,start) and expect_out(X,end) where X is a digit, corresponds to the substring position in the buffer. 0 refers to strings which matched the entire pattern and is generated for glob patterns as well as regexp patterns.

    There is an illustrative example in the manpage.

    0 讨论(0)
提交回复
热议问题