Linux 如何在expect脚本(expect-re regex)中将变量用作expect值

Linux 如何在expect脚本(expect-re regex)中将变量用作expect值,linux,expect,Linux,Expect,我有一个expect脚本,其中我并不总是知道输出,也不想硬编码从给定命令返回的预期输出,而是将预期输出的一部分作为命令行变量传入。然后,我想使用预期的输出作为正则表达式的一部分进行验证 我看了几个示例,只看到cli变量与send命令一起使用,而与expect-re命令一起使用 #!/usr/bin/expect set output [lindex $argv 0] set host [lindex $argv 1] set regex "{(?n)^${output}.*}" puts $

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

我看了几个示例,只看到cli变量与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"
期望 Regex应作为输出cli变量中设置的值处理


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

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

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

set regex "{(?n)^${output}.*}"
expect是Tcl语言的一个扩展:在Tcl中,使用双引号括起一个“单词”,允许变量和命令替换;使用大括号将单词括起来,不允许使用任何子位置(如shell中的单引号)


只需从$regex值中删除大括号。

Hi感谢您的回复,当上面的expect脚本与第一个脚本一起运行时,它会失败,当字符串硬编码到regex时,它会工作。知道为什么会这样吗
set regex{(?n)^${output}.*}set regex_text{(?n)^Error.*}
Error:
expect:spawn id exp6在执行“expect eof”时未打开
Tcl不会展开大括号内的变量。使用双引号代替。在开发代码时,请使用
expect-d
进行调试,这非常好,非常感谢,对于像我这样在这方面没有经验的人,我也不得不改变它。我将正则表达式设置为
(?n)^${output}.*
而不是
{(?n)^${output}.*}