如果所有其他操作都失败,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
记住两条规则:

  • Tcl转换反斜杠序列
  • 模式匹配器将反绑字符视为文字 注意:除了问题,还有一个观察。您将expect块称为
    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