2011-04-20 67 views
2

我在bash中使用expect。我想我的腳本telnet到一個盒子,期待一個提示,發送一個命令。如果現在有不同的提示,則必須繼續,否則必須再次發送該命令。 我的腳本是這樣的:while while loops within expected

\#!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 { 
+0

你可能想先寫一個純粹的期望腳本在調試這個問題,所以您不必shell引用規則可能會以微妙的方式改變您期望的腳本。 – 2011-04-20 22:37:19

+0

奇怪的錯誤發生了什麼:因爲腳本是雙引號的,shell(不期望)用'null'替換'$ temp'。 – 2011-04-21 01:23:58

回答

10

這就是我想實現這一點:

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 
  • 使用一個q圍繞期望腳本來保護預期變量
  • 將shell變量作爲參數傳遞給腳本。
  • 使用「exp_continue」循環,而不是一個明確的while循環(你有反正錯終止變量名)
+0

它的工作!謝謝大家!!但有一個查詢,當我們把exp_continue,它會發送「命令」,如果它沒有看到提示2?我的意思是循環。或者發送一次命令並持續等待prompt2? – Pkp 2011-04-21 00:17:05

+0

當它看到Prompt1時,它會發送命令,然後回到expect塊的頂部並等待Prompt1或Prompt2。當它看到提示2時,它發送「是」並剛剛脫離該塊。 – 2011-04-21 01:22:02

+0

終於明白了..謝謝:) – Pkp 2011-04-21 01:54:01

4

的,而語法「而人體試驗」。每個部件之間必須有一個spce,這就是爲什麼你會得到錯誤「沒有這樣的命令,同時)」

另外,由於tcl引用規則,99.99%的測試需要花在大括號中。因此,語法是:

while {$temp == 1} { 

欲瞭解更多信息,請參閱http://tcl.tk/man/tcl8.5/TclCmd/while.htm

(你可能有與您選擇的殼報價等問題;這個答案解決有關while語句您的具體問題)