我正在尝试制作一个脚本来将文件传输到另一台设备。由于我无法解释可能发生的每一个错误,我试图制作一个if-all-else失败的情况:
spawn scp filename login@ip:filename
expect "word:"
send "password"
expect {
"100" {
puts "success"
} "\*" {
puts "Failed"
}
}
这总是返回一个失败的消息,甚至不传输文件,这段代码在哪里:
spawn scp filename login@ip:filename
expect "word:"
send "password"
expect "100"
puts "success"
显示文件的传输并打印成功消息。
我无法理解我的if-expect语句在第一段代码中出了什么问题。
答案 0 :(得分:4)
问题在于\*
。反斜杠将由Tcl翻译,从而使\*
单独进入*
,然后传递给expect
expect *
如您所知,*
匹配任何内容。这就像说,"我不在乎输入缓冲区中的内容。扔掉它。" 这种模式总是匹配,即使没有任何东西。 请记住*
匹配任何内容,空字符串就是任何东西!作为此行为的必然结果,此命令始终立即返回。它永远不会等待新数据到来。它没有必要因为它匹配所有东西。
我不知道你为什么使用*。假设,如果您打算匹配文字星号,请使用\\*
。
字符串\\*
由Tcl翻译为\*
。模式匹配器然后将\*
解释为匹配文字*
的请求。
expect "*" ;# matches * and? and X and abc
expect "\*" ;# matches * and? and X and abc
expect "\\*" ;# matches * but not? or X or abc
记住两条规则:
注意:除了问题,一个观察。您将期望块视为if-else
块。 与If-Else块不同。
原因是,在传统的if-else
块中,我们确定至少会执行一个块。但是,在expect
中,情况并非如此。它更像是多个if
块。