如果所有其他操作都失败,tcl脚本将失败
我正在尝试制作一个脚本以将文件传输到另一个设备。由于我无法解释可能发生的每一个错误,因此我尝试在所有其他方法都失败的情况下:如果所有其他操作都失败,tcl脚本将失败,tcl,expect,scp,Tcl,Expect,Scp,我正在尝试制作一个脚本以将文件传输到另一个设备。由于我无法解释可能发生的每一个错误,因此我尝试在所有其他方法都失败的情况下: spawn scp filename login@ip:filename expect "word:" send "password" expect { "100" { puts "success" } "\*" { puts "Failed" } } 这将始终返回失败消息,甚至不会传输文件,其中如下代码: sp
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语句有什么问题。问题是因为
\*
。反斜杠将由Tcl翻译,从而将\*
单独转换为*
,然后作为
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
中,情况并非如此。如果单独使用块,它更像是多个。问题是因为\*
。反斜杠将由Tcl翻译,从而将\*
单独转换为*
,然后作为
expect *
正如您所知,*
匹配任何内容。这就像说,“我不在乎输入缓冲区中有什么。扔掉它。”即使没有任何内容,这种模式也总是匹配的记住,*
匹配任何内容,空字符串就是任何内容作为此行为的必然结果,此命令总是立即返回。它从不等待新数据的到来。它不必这样做,因为它匹配所有内容
我不知道你为什么用*。假设,如果您的目的是匹配文字星号,则使用\\*
字符串\\*
由Tcl翻译为\*
。然后,模式匹配器将\*
解释为匹配文本*
的请求
expect "*" ;# matches * and? and X and abc
expect "\*" ;# matches * and? and X and abc
expect "\\*" ;# matches * but not? or X or abc
记住两条规则:
Tcl转换反斜杠序列
模式匹配器将反绑字符视为文字李>
注意:除了问题,还有一个观察。您将expect块称为if-else
块它与If Else块不同。
原因是,在传统的if-else
块中,我们确信至少会执行该块中的一个。但是,在expect
中,情况并非如此。如果单独使用
块,它更像是多个。你能告诉我为什么使用\*
?你打算匹配字面上的美元符号吗?我想它会像if-else语句一样,如果它匹配100,它就会跳出。否则,如果没有100,那么它将被视为一个错误,因此它将打印一个fail@Dinesh*
被称为星号<代码>$
是美元符号。@Jerry:谢谢。现在更正了。您能告诉我为什么使用\*
?你打算匹配字面上的美元符号吗?我想它会像if-else语句一样,如果它匹配100,它就会跳出。否则,如果没有100,那么它将被视为一个错误,因此它将打印一个fail@Dinesh*
被称为星号<代码>$是美元符号。@Jerry:谢谢。现在更正它。我的想法是,如果100
匹配,那么它将跳出expect语句(类似于if-else语句)。如何像if-else语句一样配置它?正如我提到的,它不是if-else
块。顺便问一下,你对else block的期望是什么?您可以使用超时
而不是\*
,作为故障保护方案。如果出现100,它将打印“成功”。如果发生超时,它将打印“失败”。您可以将timeout
值更改为set timeout 60
。默认值为10s。我的期望值是:如果显示100(这表示100%),则文件已成功传输。如果出现除100以外的任何其他内容,则表示文件传输失败。因此,它将打印失败消息expect
实际上是一个“等待这些匹配之一或我们超时”块。它实际上并不映射到任何标准的结构化编程符号(尽管它与并发逻辑系统可以做的一些事情相对接近)。我的想法是,如果100
匹配,那么它将跳出expect语句(类似于if-else语句)。如何像if-else语句一样配置它?正如我提到的,它不是if-else
块。顺便问一下,你对else block的期望是什么?您可以使用超时
而不是\*
,作为故障保护方案。如果出现100,它将打印“成功”。如果发生超时,它将打印“失败”。您可以更改超时
值a