虽然期望循环

时间:2011-04-20 21:06:10

标签: bash while-loop expect

我在bash中使用expect。我希望我的脚本telnet到一个框中,期待一个提示,发送一个命令。如果现在有不同的提示,则必须继续,否则它必须再次发送该命令。 我的脚本是这样的:

\#!bin/bash  
//I am filling up IP and PORT1 here  
expect -c "    
set timeout -1  
spawn telnet $IP $PORT1  
sleep 1  
send \"\r\"  
send \"\r\"  
set temp 1  
while( $temp == 1){    
expect {  
Prompt1 { send \"command\" }  
Prompt2 {send \"Yes\"; set done 0}  
}  
}  
"  

输出:

invalid command name "while("  
    while executing  
"while( == 1){" 

请帮帮我 我尝试将其更改为while [ $temp == 1] {

我仍然面临以下错误:

输出:

invalid command name "=="  
    while executing  
"== 1"  
    invoked from within  
"while [  == 1] {  
expect {

2 个答案:

答案 0 :(得分:11)

这就是我实现这个的方法:

expect -c '
  set timeout -1  
  spawn telnet [lindex $argv 0] [lindex $argv 1]  
  send "\r"  
  send "\r"  
  expect {  
    Prompt1 {
      send "command"
      exp_continue
    }  
    Prompt2 {
      send "Yes\r"
    }  
  }  
}  
'  $IP $PORT1
  • 在expect脚本周围使用单引号来保护期望变量
  • 将shell变量作为参数传递给脚本。
  • 使用“exp_continue”来循环而不是显式的while循环(无论如何你都有错误的终止变量名)。

答案 1 :(得分:4)

while的语法是“while test body”。每个部分之间必须有一个spce,这就是为什么你得到错误“没有这样的命令而”)

另外,由于tcl引用规则,99.99%的时间需要在大括号中进行测试。所以,语法是:

while {$temp == 1} {

有关详细信息,请参阅http://tcl.tk/man/tcl8.5/TclCmd/while.htm

(您可能还有其他与您选择shell引用相关的问题;此答案解决了您对while语句的具体问题)