如何在 Expect 脚本中使用变量作为期望值(expect -re regex)

How can I use a variable as an expect value in an Expect script (expect -re regex)

我有一个 expect 脚本,我并不总是知道输出,也不想对给定命令返回的预期输出进行硬编码,而是将预期输出的一部分作为命令行变量传递。然后我想使用预期的输出作为正则表达式的一部分来验证。

我看过几个例子,只能看到 cli vars 与 send 命令一起使用,而不是与 expect -re 命令一起使用。

#!/usr/bin/expect

set output [lindex $argv 0]
set host [lindex $argv 1]

set regex "{(?n)^${output}.*}"
puts $regex

set timeout -1

spawn ssh root@$host
expect -re {(?n)^Password.*}

send "myPassword\n"
expect -re $regex

expect eof

输出

Password: couldn't compile regular expression pattern: quantifier operand invalid
    while executing
"expect -re $regex"

预计 正则表达式应作为输出 cli 变量中设置的值处理。

请注意:当值被硬编码时,脚本会按预期工作

正则表达式中的大括号是量词语法。例如,要查找 3 "a",可以使用 a{3}

您对 $regex 变量的赋值包含文字大括号

set regex "{(?n)^${output}.*}"

expect 是 Tcl 语言的扩展:在 Tcl 中,您使用双引号括起 "word" 允许变量和命令替换;您使用大括号括起不允许替换的单词(如 shell 中的单引号)。

只需删除 $regex 值中的大括号即可。